一.下载源码
https://github.com/xuxueli/xxl-job/releases
二.准备环境
- 在MySQL5.6+上执行源码目录下\doc\db\tables_xxl_job.sql脚本(脚本中初始化了一个账户,一个执行器)
- 使用idea导入源码目录下\xxl-job-admin的maven项目
- 修改\xxl-job-admin(下面简称admin)项目application.properties中数据库配置,改为自己本地
- admin是基于Springboot,按照Springboot方式即可启动。
- 根据application.properties的配置,默认访问地址为127.0.0.1:8080/xxl-job-admin,默认账目密码为admin/123456
三.接入调度任务
xxl-job采用调度与任务分离的模式,分为两块:调度中心(admin),任务(executor).上面启动的即为admin,admin负责调度任务,控制任务的触发时机以及路由策略。executor负责具体要执行的业务,即任务代码写在executor中。而工作中一般业务写在service层,所以可以将executor接入到service层,然后将任务代码写到executor。下例中使用无框架的方式演示接入executor。
1.新建一个简单maven项目,导入使用xxljob需要的包
<dependencies>
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
知识兔2.创建executor配置类(使executor注册业务到admin)
1 public class XxljobConfig {
2
3 private static final String ADMIN_ADDRESSES = "http://127.0.0.1:8080/xxl-job-admin";
4 private static final String EXECUTOR_APPNAME = "txxljob"; // EXECUTOR_APPNAME需要先到admin配置
5
6 private static XxlJobExecutor xxlJobExecutor;
7
8 static {
9 // 实例化,此处仅配置了最基本的参数
10 xxlJobExecutor = new XxlJobExecutor();
11 xxlJobExecutor.setAdminAddresses(ADMIN_ADDRESSES);
12 xxlJobExecutor.setAppName(EXECUTOR_APPNAME);
13 }
14
15 public static void start(int port) {
16
17 // 注册需要调度的业务
18 initRegister(port);
19
20 // 启动(注册到调度中心)
21 try {
22 xxlJobExecutor.setPort(port);
23 xxlJobExecutor.start();
24 System.out.println("xxljob成功注册到调度中心");
25 } catch (Exception e) {
26 e.printStackTrace();
27 }
28 }
29
30 public static void destory() {
31 if (null != xxlJobExecutor)
32 xxlJobExecutor.destroy();
33 }
34
35 private static void initRegister(int port) {
36 XxlJobExecutor.registJobHandler("XxljobDemoService", new XxljobDemoService(port)); // 注册任务代码到admin
37 }
38
39 }
知识兔注意上面代码中EXECUTOR_APPNAME = "txxljob",需要先到admin中配置一个AppName为txxljob的执行器。可以将EXECUTOR_APPNAME看做是执行器的唯一标识,admin调度任务时先根据执行器找任务。
3.创建一个简单的任务,让调度中心调度
1 public class XxljobDemoService extends IJobHandler {
2
3 private final int port;
4
5 public XxljobDemoService(int port) {
6 this.port = port;
7 }
8
9 public ReturnT<String> execute(String s) {
10 System.out.println("demo业务" + port +"被调度中心调度");
11 return SUCCESS;
12 }
13 }
知识兔注意:2中XxljobConfig中XxlJobExecutor.registJobHandler("XxljobDemoService", new XxljobDemoService(port))将XxljobDemoService注册到调度中心。
4.创建两个启动类,模拟分布式环境
1 public class App1 {
2
3 public static void main(String[] args) throws InterruptedException {
4 XxljobConfig.start(9994);
5 while (true) {
6 TimeUnit.HOURS.sleep(1);
7 }
8 }
9
10 }
知识兔 1 public class App2 {
2
3 public static void main(String[] args) throws InterruptedException {
4 XxljobConfig.start(9995);
5 while (true) {
6 TimeUnit.HOURS.sleep(1);
7 }
8 }
9
10 }
知识兔5.分别启动App1和App2,将会注册两个实例到admin中
四.在admin中配置任务的执行规则以及策略
* 执行器:选中上面配置的自定义执行新txxljob(因为executor注册时使用的是此执行器)
* 路由策略:由于注册了两个实例到admin,所以这里选择轮询,让两个实例都能得到执行,也可以选择其他的路由策略
* 运行模式:BEAN是本文中使用的运行模式,即将业务代码写到独立于admin的项目中,然后注册到admin中。xxljob也支持在admin平台页面中直接写业务代码的方式。
* Cron:即普通的cron表达式,控制任务的触发时机
* JobHandler:可以看做是任务的索引,与代码中保持一致
五.启动四中配置的任务,观察executor被调度情况
观察App1和App2控制台输出如下,说明admin可以正常调度App1和App2中的任务,接入完成。