一、tbSchedule简介
tbSchedule是一个基于Quartz的分布式任务调度框架,由淘宝负责研发和维护。它提供了一套完整的分布式任务调度解决方案,支持多种任务类型和任务调度模式。tbSchedule使用Zookeeper进行节点管理和状态同步,使得不同节点之间能够实现任务的高可用性和负载均衡。同时,tbSchedule也具备监控和告警功能,能够简单地监控任务的运行状态和异常情况。
二、tbSchedule的特性
1. tbSchedule提供了多种任务类型和调度模式
tbSchedule支持定时任务、周期性任务、并行任务、串行任务和流程任务等多种任务类型。同时,它还提供了基于Quartz的任务调度模式(SimpleTrigger、CronTrigger、CalendarIntervalTrigger、DailyTimeIntervalTrigger等),以及自定义的任务调度模式。这些丰富多样的任务类型和调度模式,让用户能够根据实际业务需求,灵活地创建不同类型、不同调度模式的任务。
2. tbSchedule支持任务高可用和负载均衡
tbSchedule使用Zookeeper进行节点管理和状态同步,使得不同节点之间能够实现任务的高可用性和负载均衡。无论是节点宕机、网络故障还是其他异常情况,tbSchedule都能够自动切换节点并保证任务的正常运行。同时,tbSchedule还提供了多种负载均衡策略,能够根据实际情况选择最优的任务分配方式。
3. tbSchedule提供了监控和告警功能
tbSchedule内置了监控和告警功能,能够简单地监控任务的运行状态和异常情况。用户可以通过Web界面查看任务的运行情况,并可以设置告警规则,及时处理任务异常情况。同时,tbSchedule还提供了丰富的监控指标和事件日志,方便用户对任务调度情况进行精细化分析。
三、tbSchedule使用示例
1. tbSchedule bug
在使用tbSchedule时,可能会遇到一些bug或者异常情况。比如,启动任务时可能会出现“任务已在运行中”、“任务已经被删除”等异常信息。这时,可以通过查看日志和调试代码,针对性修复问题。同时,在使用tbSchedule时,也要注意避免一些常见的错误,比如任务依赖问题、重复执行问题、线程安全问题等。
2. tbSchedule保证只直行一次
public class MyTask implements IScheduleTaskDeal{ // 设置每次执行任务获取的数据量 @Override public List select(TBScheduleManager scheduleManager, int taskItemNum, List taskItemList, int eachFetchDataNum) throws Exception { // TODO Auto-generated method stub } // 设置任务执行结果处理 @Override public boolean execute(TBScheduleManager scheduleManager, TaskItemDefine taskItem, String taskData) throws Exception { // TODO Auto-generated method stub // 任务执行成功,设置该任务不可用 scheduleManager.setTaskItemUnavailable(taskItem); return true; } // 设置任务异常处理 @Override public boolean execute(TBScheduleManager scheduleManager, TaskItemDefine taskItem, String taskData, String exMsg) throws Exception { // TODO Auto-generated method stub // 任务执行异常,设置该任务不可用 scheduleManager.setTaskItemUnavailable(taskItem); return true; } }
在tbSchedule中,为了防止任务多次执行,需要设置每个任务只能执行一次。可以通过在任务执行完成后,将任务设为不可用,从而保证任务不会重复执行。在上述代码示例中,我们重写了IScheduleTaskDeal接口的execute方法,在任务执行成功或失败时,都将该任务设为不可用。
3. tbSchedule重复消费选取
public class MyTask implements IScheduleTaskDeal{ // 设置每次执行任务获取的数据量 @Override public List select(TBScheduleManager scheduleManager, int taskItemNum, List taskItemList, int eachFetchDataNum) throws Exception { // TODO Auto-generated method stub List dataList = new ArrayList (); for (TaskItemDefine taskItem : taskItemList) { // 选取未执行过的任务数据 String data = selectData(taskItem); if (data != null) { dataList.add(data); } } return dataList; } // 设置任务执行结果处理 @Override public boolean execute(TBScheduleManager scheduleManager, TaskItemDefine taskItem, String taskData) throws Exception { // TODO Auto-generated method stub // 任务执行成功,设置该任务不可用 scheduleManager.setTaskItemUnavailable(taskItem); return true; } // 设置任务异常处理 @Override public boolean execute(TBScheduleManager scheduleManager, TaskItemDefine taskItem, String taskData, String exMsg) throws Exception { // TODO Auto-generated method stub // 任务执行异常,设置该任务不可用 scheduleManager.setTaskItemUnavailable(taskItem); return true; } private String selectData(TaskItemDefine taskItem) { // TODO: 根据任务项查询未执行过的任务数据 return null; } }
在tbSchedule中,为了避免任务重复消费,需要在数据选取时,仅选取未执行过的任务数据。可以通过在select方法中,判断任务是否执行过,从而避免重复消费。在上述代码示例中,我们在selectData方法中,根据任务项查询未执行过的任务数据。
四、总结
通过以上对tbSchedule的介绍和使用示例,我们可以发现,tbSchedule是一个功能强大的分布式任务调度框架,能够满足不同业务场景下的任务调度需求。在使用tbSchedule时,需要注意避免一些常见的错误和Bug,比如任务依赖问题、重复执行问题、线程安全问题等。此外,tbSchedule还提供了监控和告警功能,方便用户对任务调度情况进行监控和精细化分析。