§ 本文目标

掌握分布式定时任务的开发,配置,调试

§ 练习场景

为微服务应用开发定时任务,为系统打印提示信息

前提:

  • 基于微服务工程创建章节创建的工程开发
  • 数据库
  • yusp-job-admin微服务应用

§ 操作步骤

微服务模式下,yusp-job-admin服务默认作为调度中心,调度中心部署参考2.4.7 系统管理微服务部署,先获取调度中心jar包,然后进行调度中心部署;以下操作步骤是进行执行器开发以及在执行器开发BEAN模式的任务代码

§ 引入依赖

pom.xml文件中引入yusp-common-job的JAR包

pom.xml

<dependency>
   <groupId>cn.com.yusys.yusp</groupId>
   <artifactId>yusp-common-job</artifactId>
   <version>V2.1.1.20190403.RELEASE</version>
</dependency>
1
2
3
4
5

§ application配置

applicatiion:
    #定时任务配置
    xxl:
      job:
            enabled: true  
        admin:
            addresses: http://127.0.0.1:8080/yusp-job-admin #127.0.0.1:8080指网关ip:port,yusp-job-admin为调度中心服务名称。通过网关,注册到微服务的/api/server接口,完成注册动作
        executor:
            appname: example   #执行器名称,要求务必唯一
            ip:  #执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP
            port: 9097          #调度中心给微服务发送任务,通过此端口发送指令
            logpath: D:/temp    #执行器日志文件路径
            logretentiondays: 3  # 本地日志保存天数,-1为永远保存
1
2
3
4
5
6
7
8
9
10
11
12
13

§ 编写任务代码

BEAN模式下编写任务代码,即开发一个JobHandler,步骤如下:

  1. 继承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”
  2. 注册到Spring容器:添加“@Component”或“@Service”注解,被Spring容器扫描为Bean实例
  3. 注册到执行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值,会在下面任务配置中用到

JobExample.java

package cn.com.yusys.yusp.example.common.service.impl;
import cn.com.yusys.yusp.commons.job.core.biz.model.ReturnT;
import cn.com.yusys.yusp.commons.job.core.handler.IJobHandler;
import cn.com.yusys.yusp.commons.job.core.handler.annotation.JobHandler;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 微服务开发示例:定时任务.
 *
 * @since 2.1.1
 */
@JobHandler(value = "exampleJobId") // 全球唯一
@Service
public class JobDemoServiceImpl extends IJobHandler {
  @Value("${example.job.sleep:5}")
  private long second;
  
  private final SimpleDateFormat miSecond=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
  @Override
  public ReturnT<String> execute(String param) throws Exception {
            try {
                      System.out.println(Thread.currentThread()+":开始执行,"+miSecond.format(new Date()));
                      Thread.sleep(second * 1000);
                      System.out.println(Thread.currentThread()+":执行完成,"+miSecond.format(new Date()));
            } catch (InterruptedException e) {
                      System.out.println(Thread.currentThread() + ": being interrupted,使用策略:[覆盖之前调度]," + miSecond.format(new Date()));
  }
            return ReturnT.SUCCESS;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

§ 执行器配置

新增执行器,执行器名称在application配置中,application.xxl.job.executor.appname参数配置的名称

JobHandler_01

JobHandler_02

新增完成稍等片刻(或直接重启服务,重启服务也需要在启动后等待一个心跳的时间,约30秒)将会有微服务的注册ip出现,代表微服务心跳已经发送到调度中心,如下:

JobHandler_03

JobHandler_04

§ 任务配置

任务管理中,新增任务

JobHandler_05

  • 执行器选择在3.5中配置的执行器
  • 路由策略一般选择“轮询”
  • 运行模式为BEAN模式时,需要输入JobHandler。JobHandler为3.4中,@JobHandler注解的value参数值
  • 运行模式为GLUE模式时,需要在GLUE按钮操作页面,正确编写任务逻辑代码

JobHandler_06

§ 测试

§ 执行任务

系统管理页面,调度管理-任务管理,选择任务,执行,然后点击调度日志,查看执行结果

JobHandler_07

日志明细

JobHandler_08

微服务任务日志

XxlJobExecutor.registJobThread:213 - >>>>>>>>>>> job regist JobThread success, jobId:78fe0eb888d04b0ea83cd3bbb35592ad, handler:cn.com.yusys.yusp.example.common.service.impl.JobDemoServiceImpl@4d48bd85
Thread[Thread-229,5,main]:开始执行,2019-03-18 04:27:24.266
Thread[Thread-229,5,main]:执行完成,2019-03-18 04:27:29.266
1
2
3

§ 单体应用场景

§ 配置

引入yusp-job-admin-core的JAR包,“${yusp-job-admin-core.version}”为对应的版本号

pom.xml

<dependency>
   <groupId>cn.com.yusys.yusp</groupId>
   <artifactId>yusp-job-admin-core</artifactId>
   <version>V2.1.1.20190403.RELEASE</version>
</dependency>
1
2
3
4
5

§ application.yml配置

application_${profile}.yml

applicatiion:
    xxl:
        job:
            admin:
                addresses: http://127.0.0.1:${server.port}/${server.servlet.context-path}  #127.0.0.1替换为单体部署实际IP地址
            enabled: false           #xxl job调度配置是否启用
            executor:
                appname: message     #应用名称
                ip:                #默认值为 
                logpath: D:/temp
                logretentiondays: 3 # 本地日志保存天数,-1为永远保存
                port: 9097          #调度中心给微服务发送任务,通过此端口发送指令
    #定时任务出错邮件发送
    email:
        host: smtp.163.com
        port: 25
        username: 123@163.com
        password: 123
        sendNick: 《任务调度平台XXL-JOB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

§ 执行器配置

单体模式下,只需要配置一个执行器即可,单体既是调度器,又是执行器

最后更新于: 4/28/2022, 5:10:13 PM