Springboot中执行定时任务

2019-02-21  本文已影响0人  炒酸奶没有酸奶

Springboot中执行定时任务

标签(空格分隔): simbest开发技术博客


[TOC]

参考https://blog.csdn.net/jeikerxiao/article/details/74559244
          https://blog.csdn.net/snakemoving/article/details/77480449

一、背景

      在实际项目开发中,定时任务是一种很常见的功能。通过使用定时器完成一些业务逻辑,比如天气接口的数据获取,定时发送短信,邮件,同步组织人员,以及商城中每天用户的限额,定时自动收货等等。
      创建定时器的方式大致有三种:

      今天我们就来看下在sping boot中如何集成定时任务,讲解基于simbest-cores框架的应用。


二、环境搭建

      搭建一个sping boot项目


三、添加定时任务类

3.1 继承simbest-core包下的 AbstractTaskSchedule类

@Slf4j
@Component
public class SyncTimUserTask extends AbstractTaskSchedule {
   
    @Value("${app.sync.tim.user.address}")
    private String timUserAddress; //业务字段

    @Autowired
    public SyncTimUserTask(AppRuntimeMaster master, SysTaskExecutedLogRepository repository) {
        super(master, repository);
    }

    /**
     * 开启定时器
     */
    @Scheduled (cron = "${app.task.sync.tim.user}")  //何时执行这个定时任务
    public void checkAndExecute() {
        super.checkAndExecute();
    }

    @Override
    public String execute() {
       // TODO 业务代码
    }
}

从上面的代码可以看出,新建一个类,继承AbstractTaskSchedule类,就可以实现一个定时任务类。
注解@Compoment用来标明这是一个被Spring管理的Bean,这个就不用多做讲解了。
开启定时任务,通过@Scheduled (cron = "XXXXX"),即可开启定时器。

3.1 自定义XXXXTask.java类

@Slf4j
@Component
public class SyncAllOrgDataTask  {
    public final static String CHECK_FAILED = "FAILED";

    @Autowired
    private AppRuntimeMaster appRuntime;

    @Autowired
    private SysTaskExecutedLogRepository repository;

    /**
     * 开启定时器
     */
    @Scheduled (cron = "XXXXX") // 定时任务执行方式
    public void checkAndExecute() {
        checkAndExecute(true);
    }

    private void checkAndExecute(boolean writeLog) {
        if(appRuntime.getMyHost().equals( UumsConstants.IP)
                && appRuntime.getMyPort().equals(UumsConstants.PORT)) {
            Long beginTime = System.currentTimeMillis();
            Boolean executeFlag = true;
            String content = CHECK_FAILED;
            try {
                content = this.execute();
            } catch (Exception e) {
                executeFlag = false;
                log.error("Execute taskName with {} failed.", this.getClass().getSimpleName());
                Exceptions.printException(e);
            }
            if(writeLog) {
                Long endTime = System.currentTimeMillis();
                SysTaskExecutedLog log = SysTaskExecutedLog.builder()
                        .taskName(this.getClass().getSimpleName())
                        .hostname(appRuntime.getMyHost())
                        .port(appRuntime.getMyPort())
                        .durationTime(endTime - beginTime)
                        .content( StringUtils.substring(content, 0, 2000))
                        .executeFlag(executeFlag)
                        .build();
                repository.save(log);
            }
        } else {
            log.debug("Master running {} on {}, I'm running {} on {}, I couldn't execute the job",
                    appRuntime.getMasterHost(), appRuntime.getMasterPort(), appRuntime.getMyHost(), appRuntime.getMyPort());
        }
    }

    private String execute() {
      // 业务代码
    }
}

四、一些必要的配置

4.1 pom.xml文件

添加定时任务执行时间,这里还是以上节3.1代码为例:

<app.task.sync.tim.user>0 0/1 * * * ?</app.task.sync.tim.user>

添加定时任务要访问的地址(根据实际业务需求,自行设置),这里还是以上节3.1代码为例:

<app.sync.tim.org.address>http://10.87.13.18:9081/userlog/getorglog.json</app.sync.tim.org.address>

4.2 application.properties文件

添加pom.xml文件中所设置的定时任务执行时间 | (定时任务要访问的地址,根据实际业务需求自行设置)

app.task.sync.tim.user=${app.task.sync.tim.user}
app.sync.tim.user.address=${app.sync.tim.user.address}

附:定时任务 Cron表达式

附1:基础格式

{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}

字段 允许值 允许的特殊字符
0-59 , - * /
0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可为空) 留空, 1970-2099 , - * /

附2:特殊字符

附3:示例

"0 0 12 * * ?" 每天中午12点触发

"0 15 10 ? * *" 每天上午10:15触发

"0 15 10 * * ?" 每天上午10:15触发

"0 15 10 * * ? *" 每天上午10:15触发

"0 15 10 * * ? 2005" 2005年的每天上午10:15触发

"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发

"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发

"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发

"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发

"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发

"0 15 10 15 * ?" 每月15日上午10:15触发

"0 15 10 L * ?" 每月最后一日的上午10:15触发

"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发

"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发

"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

上一篇下一篇

猜你喜欢

热点阅读