- 在springboot启动类添加定时器注解开关@EnableScheduling
- 实现公用调度器
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import com.chobits81.cc.component.system.model.GnzlTrigger;
import com.chobits81.cc.component.system.service.DirectDefine;
/**
* 定时调度器
* @author Kyoxue
*/
public abstract class GnzlScheduler implements SchedulingConfigurer,DirectDefine{
private String cron = StringUtils.EMPTY;
@Override
public void configureTasks(ScheduledTaskRegistrar arg0) {
// TODO Auto-generated method stub
arg0.addTriggerTask(runnable(), shcheduler());
}
private Runnable runnable() {
return new Runnable() {
@Override
public void run() {
boolean on = false;
GnzlTrigger config = setup();
if (null != config) {
//配置修改表达式这里同步更新定时时间
cron = StringUtils.trimToEmpty(config.getCron());
//任务开关
String onoff = config.getOnoff();
on = (StringUtils.isNotEmpty(onoff)&&"Y".equalsIgnoreCase(onoff))?true:false;
}
if (!on) {
LOG.warn("定时开关已关闭!");
return;
}
task();
}
};
}
private Trigger shcheduler() {
return new Trigger() {
@SuppressWarnings("deprecation")
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
try {
if (!SCHEDULER_SWITCH_ON) {
// LOG.warn("定时触发器开关已关闭!");
return null;
}
//第一次springboot启动,初始化触发器,读取配置表达式
//初始化表达式如果为空或者格式不准确直接导致任务永久停止
//如果配置表没有表达式或错误格式,修改后springboot需要重启,才能启动定时触发器
GnzlTrigger config = setup();
if (null != config) {
cron = StringUtils.trimToEmpty(config.getCron());
}
CronTrigger trigger = new CronTrigger(cron);
return trigger.nextExecutionTime(triggerContext);
} catch (Exception e) {
// TODO: handle exception
LOG.error("表达式定义异常!{}",e.getMessage());
return null;
}
}
};
}
/**
* 读取定时配置 提供外部读取配置
* @return
*/
public abstract GnzlTrigger setup();
/**
* 覆盖定时内容 提供外部执行任务
*/
public abstract void task();
}
- 新建自己的任务
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.chobits81.cc.component.system.dao.GnzlTriggerMapper;
import com.chobits81.cc.component.system.model.GnzlLog;
import com.chobits81.cc.component.system.model.GnzlTrigger;
import com.chobits81.cc.component.system.service.impl.DirectLogServiceImpl;
import com.chobits81.cc.component.system.service.impl.DirectMessageQService;
import com.chobits81.cc.component.system.service.impl.DirectMqEnum;
import com.chobits81.cc.component.util.Pagenation;
/**
* xxx任务
* @author Kyoxue
* @deprecated
*/
@Service
public class GnzlSchedulerSearchLog2db extends GnzlScheduler{
@Autowired
private GnzlTriggerMapper gnzlTriggerMapper;
@Autowired
private DirectMessageQService directMessageQService;
@Autowired
private DirectLogServiceImpl directLogServiceImpl;
@Override
public void task() {
// TODO Auto-generated method stub
try {
//task code here...
} catch (Exception e) {
// TODO: handle exception
LOG.error("{}{}异常了!{}",LOG_PREFIX_QNR,LOG_PREFIX_RUN_LOG2DB,e);
}
}
@Override
public GnzlTrigger setup() {
// TODO Auto-generated method stub
try {
return gnzlTriggerMapper.selectBySName(KEY_GNZL_SEARCH_LOG2DB);
} catch (Exception e) {
// TODO: handle exception
LOG.error("读取配置异常!",e);
}
return null;
}
}
- 定时表达式配置表
CREATE TABLE `t_gnzl_trigger` (
`sname` varchar(20) NOT NULL COMMENT '定时索引',
`cron` varchar(64) NOT NULL COMMENT '表达式',
`switch` char(1) NOT NULL DEFAULT 'N' COMMENT '开关 Y|N',
`remark` varchar(128) DEFAULT NULL COMMENT '再次擦除结果 Y:成功 N:失败',
`createTime` datetime NOT NULL COMMENT '录入时间',
`creater` varchar(64) NOT NULL DEFAULT 'GNZL' COMMENT '录入人',
`modifier` varchar(64) DEFAULT NULL,
`modifyTime` datetime DEFAULT NULL,
PRIMARY KEY (`sname`),
UNIQUE KEY `sname` (`sname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='定时任务表';
-
配置示例
image.png