分布式调度xxl-job实战应用解析今天分享,业务场景经常出现分布式定时任务情况,以前经常采用分布式锁解决,不过随着业务场景的复杂度变大,分布式锁的方案开始满足不了很多业务场景,因此这篇文章,我们重点分析实战使用:
服务端集成mysql数据库,数据库初始化几张表,作用和分布式锁相关,数据库配置等等。
1、数据库脚本
- CREATE database if NOT EXISTS `xxl-job` default character set utf8 collate utf8_general_ci;
- use `xxl-job`;
-
-
- CREATE TABLE XXL_JOB_QRTZ_JOB_DETAILS
- (
- SCHED_NAME VARCHAR(120) NOT NULL,
- JOB_NAME VARCHAR(200) NOT NULL,
- JOB_GROUP VARCHAR(200) NOT NULL,
- DESCRIPTION VARCHAR(250) NULL,
- JOB_CLASS_NAME VARCHAR(250) NOT NULL,
- IS_DURABLE VARCHAR(1) NOT NULL,
- IS_NONCONCURRENT VARCHAR(1) NOT NULL,
- IS_UPDATE_DATA VARCHAR(1) NOT NULL,
- REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
- JOB_DATA BLOB NULL,
- PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
- );
-
- CREATE TABLE XXL_JOB_QRTZ_TRIGGERS
- (
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- JOB_NAME VARCHAR(200) NOT NULL,
- JOB_GROUP VARCHAR(200) NOT NULL,
- DESCRIPTION VARCHAR(250) NULL,
- NEXT_FIRE_TIME BIGINT(13) NULL,
- PREV_FIRE_TIME BIGINT(13) NULL,
- PRIORITY INTEGER NULL,
- TRIGGER_STATE VARCHAR(16) NOT NULL,
- TRIGGER_TYPE VARCHAR(8) NOT NULL,
- START_TIME BIGINT(13) NOT NULL,
- END_TIME BIGINT(13) NULL,
- CALENDAR_NAME VARCHAR(200) NULL,
- MISFIRE_INSTR SMALLINT(2) NULL,
- JOB_DATA BLOB NULL,
- PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
- FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
- REFERENCES XXL_JOB_QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
- );
-
- CREATE TABLE XXL_JOB_QRTZ_SIMPLE_TRIGGERS
- (
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- REPEAT_COUNT BIGINT(7) NOT NULL,
- REPEAT_INTERVAL BIGINT(12) NOT NULL,
- TIMES_TRIGGERED BIGINT(10) NOT NULL,
- PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
- FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- );
-
- CREATE TABLE XXL_JOB_QRTZ_CRON_TRIGGERS
- (
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- CRON_EXPRESSION VARCHAR(200) NOT NULL,
- TIME_ZONE_ID VARCHAR(80),
- PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
- FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- );
-
- CREATE TABLE XXL_JOB_QRTZ_SIMPROP_TRIGGERS
- (
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- STR_PROP_1 VARCHAR(512) NULL,
- STR_PROP_2 VARCHAR(512) NULL,
- STR_PROP_3 VARCHAR(512) NULL,
- INT_PROP_1 INT NULL,
- INT_PROP_2 INT NULL,
- LONG_PROP_1 BIGINT NULL,
- LONG_PROP_2 BIGINT NULL,
- DEC_PROP_1 NUMERIC(13,4) NULL,
- DEC_PROP_2 NUMERIC(13,4) NULL,
- BOOL_PROP_1 VARCHAR(1) NULL,
- BOOL_PROP_2 VARCHAR(1) NULL,
- PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
- FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- );
-
- CREATE TABLE XXL_JOB_QRTZ_BLOB_TRIGGERS
- (
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- BLOB_DATA BLOB NULL,
- PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
- FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- );
-
- CREATE TABLE XXL_JOB_QRTZ_CALENDARS
- (
- SCHED_NAME VARCHAR(120) NOT NULL,
- CALENDAR_NAME VARCHAR(200) NOT NULL,
- CALENDAR BLOB NOT NULL,
- PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
- );
-
- CREATE TABLE XXL_JOB_QRTZ_PAUSED_TRIGGER_GRPS
- (
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
- );
-
- CREATE TABLE XXL_JOB_QRTZ_FIRED_TRIGGERS
- (
- SCHED_NAME VARCHAR(120) NOT NULL,
- ENTRY_ID VARCHAR(95) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- INSTANCE_NAME VARCHAR(200) NOT NULL,
- FIRED_TIME BIGINT(13) NOT NULL,
- SCHED_TIME BIGINT(13) NOT NULL,
- PRIORITY INTEGER NOT NULL,
- STATE VARCHAR(16) NOT NULL,
- JOB_NAME VARCHAR(200) NULL,
- JOB_GROUP VARCHAR(200) NULL,
- IS_NONCONCURRENT VARCHAR(1) NULL,
- REQUESTS_RECOVERY VARCHAR(1) NULL,
- PRIMARY KEY (SCHED_NAME,ENTRY_ID)
- );
-
- CREATE TABLE XXL_JOB_QRTZ_SCHEDULER_STATE
- (
- SCHED_NAME VARCHAR(120) NOT NULL,
- INSTANCE_NAME VARCHAR(200) NOT NULL,
- LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
- CHECKIN_INTERVAL BIGINT(13) NOT NULL,
- PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
- );
-
- CREATE TABLE XXL_JOB_QRTZ_LOCKS
- (
- SCHED_NAME VARCHAR(120) NOT NULL,
- LOCK_NAME VARCHAR(40) NOT NULL,
- PRIMARY KEY (SCHED_NAME,LOCK_NAME)
- );
-
-
-
- CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_INFO` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
- `job_cron` varchar(128) NOT NULL COMMENT '任务执行CRON',
- `job_desc` varchar(255) NOT NULL,
- `add_time` datetime DEFAULT NULL,
- `update_time` datetime DEFAULT NULL,
- `author` varchar(64) DEFAULT NULL COMMENT '作者',
- `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
- `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',
- `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
- `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
- `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
- `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
- `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
- `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
- `glue_source` mediumtext COMMENT 'GLUE源代码',
- `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
- `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
- `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
- CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOG` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
- `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
- `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
- `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
- `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
- `executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
- `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
- `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
- `trigger_code` int(11) NOT NULL COMMENT '调度-结果',
- `trigger_msg` text COMMENT '调度-日志',
- `handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
- `handle_code` int(11) NOT NULL COMMENT '执行-状态',
- `handle_msg` text COMMENT '执行-日志',
- `alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
- PRIMARY KEY (`id`),
- KEY `I_trigger_time` (`trigger_time`),
- KEY `I_handle_code` (`handle_code`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
- CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOGGLUE` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
- `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
- `glue_source` mediumtext COMMENT 'GLUE源代码',
- `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
- `add_time` timestamp NULL DEFAULT NULL,
- `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
- CREATE TABLE XXL_JOB_QRTZ_TRIGGER_REGISTRY (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `registry_group` varchar(255) NOT NULL,
- `registry_key` varchar(255) NOT NULL,
- `registry_value` varchar(255) NOT NULL,
- `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
- CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_GROUP` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
- `title` varchar(12) NOT NULL COMMENT '执行器名称',
- `order` tinyint(4) NOT NULL DEFAULT '0' COMMENT '排序',
- `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
- `address_list` varchar(512) DEFAULT NULL COMMENT '执行器地址列表,多地址逗号分隔',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
-
- INSERT INTO `XXL_JOB_QRTZ_TRIGGER_GROUP`(`id`, `app_name`, `title`, `order`, `address_type`, `address_list`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 1, 0, NULL);
- INSERT INTO `XXL_JOB_QRTZ_TRIGGER_INFO`(`id`, `job_group`, `job_cron`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '0 0 0 * * ? *', '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
-
- commit;
-
执行后
2、springBoot服务引用相关jar
其实直接拉取源码就行:GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-freemarkerartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-mailartifactId>
- dependency>
- <dependency>
- <groupId>org.mybatis.spring.bootgroupId>
- <artifactId>mybatis-spring-boot-starterartifactId>
- <version>${mybatis-spring-boot-starter.version}version>
- dependency>
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>${mysql-connector-java.version}version>
- dependency>
-
- <dependency>
- <groupId>org.quartz-schedulergroupId>
- <artifactId>quartzartifactId>
- <version>${quartz.version}version>
- dependency>
-
- <dependency>
- <groupId>com.xuxueligroupId>
- <artifactId>xxl-job-coreartifactId>
- <version>2.0.2version>
- dependency>
3、配置文件相关
- ### web
- server.port=8080
- server.context-path=/xxl-job-admin
-
- ### resources
- spring.mvc.static-path-pattern=/static/**
- spring.resources.static-locations=classpath:/static/
-
- ### freemarker
- spring.freemarker.templateLoaderPath=classpath:/templates/
- spring.freemarker.suffix=.ftl
- spring.freemarker.charset=UTF-8
- spring.freemarker.request-context-attribute=request
- spring.freemarker.settings.number_format=0.##########
-
- ### mybatis
- mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
-
- ### xxl-job, datasource
- #spring.datasource.url=jdbc:mysql://192.168.43.174:3306/xxl-job?Unicode=true&characterEncoding=UTF-8&useSSL=false
- spring.datasource.url=jdbc:mysql://192.168.43.174:3306/xxl-job?Unicode=true&characterEncoding=UTF-8&useSSL=false
- spring.datasource.username=root
- spring.datasource.password=root
- spring.datasource.driver-class-name=com.mysql.jdbc.Driver
-
- spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
- spring.datasource.tomcat.max-wait=10000
- spring.datasource.tomcat.max-active=30
- spring.datasource.tomcat.test-on-borrow=true
- spring.datasource.tomcat.validation-query=SELECT 1
- spring.datasource.tomcat.validation-interval=30000
-
- ### xxl-job email
- spring.mail.host=smtp.qq.com
- spring.mail.port=25
- spring.mail.username=xxx@qq.com
- spring.mail.password=xxx
- spring.mail.properties.mail.smtp.auth=true
- spring.mail.properties.mail.smtp.starttls.enable=true
- spring.mail.properties.mail.smtp.starttls.required=true
-
-
- ### xxl-job login
- xxl.job.login.username=admin
- xxl.job.login.password=123456
-
- ### xxl-job, access token
- xxl.job.accessToken=
-
- ### xxl-job, i18n (default empty as chinese, "en" as english)
- xxl.job.i18n=
4、启动服务
- package com.xxl.job.admin;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- /**
- * @author xuxueli 2018-10-28 00:38:13
- */
- @SpringBootApplication
- public class XxlJobAdminApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(XxlJobAdminApplication.class, args);
- }
-
- }
启动后访问web控制台:http://localhost:8080/xxl-job-admin

点击登录
5、点击任务管理器

点击编辑看看以前注册的三台客户端
也可以删除xxl-enjoy 执行器,重写添加;

添加前两个参数就行
6、点击任务管理查看以前注册的

选择nandao,查看其状态

点击编辑
点击新增任务
7、点击调度日志

查看成功的日志的详情

查看失败的日志的详情

如图
这种失败是因为没有添加配置执行器导致的。
8、新增任务

这种编辑动态代码的模式,相当于直接修改生产环境的代码。保存后:
点击GLUE编辑

把自己测试好的业务代码粘贴进里面,点击保存

备注

点击关闭后就可以执行测试了
查看客户端结果
9、新增分片的业务

保存后,点击执行测试

参数

结果

1、springboot 项目 pom配置
-
- <dependency>
- <groupId>com.xuxueligroupId>
- <artifactId>xxl-job-coreartifactId>
- <version>2.0.2version>
- dependency>
2、配置文件、
- ### 调度器的地址----- 发消息
- xxl.job.admin.addresses=http://localhost:8080/xxl-job-admin
- ### 当前执行器的标识名称,同一个名字的执行器构成集群
- xxl.job.executor.appname=xxl-enjoy
- # 执行器与调度器通信的ip / port
- xxl.job.executor.ip=
- #启动多个服务可以暂时改动端口号
- xxl.job.executor.port=9991
- ### job-job, access token
- xxl.job.accessToken=
- ### job-job log path
- xxl.job.executor.logpath=/logs/xxl/job
- ### job-job log retention days
- xxl.job.executor.logretentiondays=-1
-
- #启动多个服务可以改端口号
- server.port=8281
3、客户端配置分布式调度
-
-
- import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.ComponentScan;
- import org.springframework.context.annotation.Configuration;
-
- @Configuration
- @ComponentScan(basePackages = "com.xxl.job.executor.service.jobhandler")
- public class XxlConfig {
- private Logger logger = LoggerFactory.getLogger(XxlConfig.class);
-
- @Value("${xxl.job.admin.addresses}")
- private String adminAddresses;
-
- @Value("${xxl.job.executor.appname}")
- private String appName;
-
- @Value("${xxl.job.executor.ip}")
- private String ip;
-
- @Value("${xxl.job.executor.port}")
- private int port;
-
- @Value("${xxl.job.accessToken}")
- private String accessToken;
-
- @Value("${xxl.job.executor.logpath}")
- private String logPath;
-
- @Value("${xxl.job.executor.logretentiondays}")
- private int logRetentionDays;
-
-
- @Bean(initMethod = "start", destroyMethod = "destroy")
- public XxlJobSpringExecutor xxlJobExecutor() {
- logger.info(">>>>>>>>>>> job-job config init.");
- XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
- xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
- xxlJobSpringExecutor.setAppName(appName);
- xxlJobSpringExecutor.setIp(ip);
- xxlJobSpringExecutor.setPort(port);
- xxlJobSpringExecutor.setAccessToken(accessToken);
- xxlJobSpringExecutor.setLogPath(logPath);
- xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
-
- return xxlJobSpringExecutor;
- }
-
- }
4、任务核心
-
-
- import org.springframework.stereotype.Service;
-
- @Service
- public class EnjoyBusiness {
-
- /**
- * index指示,现在跑的是第几片
- * total指示,总共有几片
- */
- public void process(int index,int total,String param) {
- if (total == 1){
- System.out.println("当前执行全业务处理,参数:"+param);
- return;
- }
-
- //分片任务
- if (index == 1 ){
- // select * from xxx limit 0,500
- } else {
- // select * from xxx limit 500,1000
- }
-
- System.out.println("当前执行第 "+(index+1)+"/"+total+"片的数据,参数:"+param);
- }
-
- }
5、三种job类型
常规的
-
-
- import com.enjoy.business.EnjoyBusiness;
- import com.xxl.job.core.biz.model.ReturnT;
- import com.xxl.job.core.handler.IJobHandler;
- import com.xxl.job.core.handler.annotation.JobHandler;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
-
- /**
- * 普通任务
- */
- @JobHandler(value="enjoySimple") //value值对应的是调度中心新建任务的JobHandler
- @Component
- public class EnjoySimple extends IJobHandler {
-
- @Autowired
- private EnjoyBusiness enjoyBusiness;
-
- @Override
- public ReturnT<String> execute(String param) throws Exception {
- enjoyBusiness.process(1,1,param);
- return SUCCESS;
- }
-
- }
分片的
-
-
- import com.enjoy.business.EnjoyBusiness;
- import com.xxl.job.core.biz.model.ReturnT;
- import com.xxl.job.core.handler.IJobHandler;
- import com.xxl.job.core.handler.annotation.JobHandler;
- import com.xxl.job.core.util.ShardingUtil;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
-
- /**
- * 分片任务
- */
- @JobHandler(value="enjoySharding")
- @Service
- public class EnjoySharding extends IJobHandler {
- @Autowired
- private EnjoyBusiness enjoyBusiness;
-
- @Override
- public ReturnT<String> execute(String param) throws Exception {
- ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
-
- int index = shardingVO.getIndex();
- int total = shardingVO.getTotal();
- enjoyBusiness.process(index,total,param);
-
- return SUCCESS;
- }
-
- }
动态修改的
-
-
- import com.xxl.job.core.biz.model.ReturnT;
- import com.xxl.job.core.handler.IJobHandler;
-
- public class EnjoyGlue extends IJobHandler {
- public ReturnT<String> execute(String param) throws Exception {
- System.out.println("测试GLUE任务,我已被执行");
- return SUCCESS;
- }
- }
6、boot的启动类
- package com.enjoy;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.context.annotation.ComponentScan;
-
- @SpringBootApplication
- public class XxlJobApp {
-
- public static void main(String[] args) {
- SpringApplication.run(XxlJobApp.class, args);
- }
-
- }
其他两个代码一样,类名不同而已。
7、依次启动三个客户端,启动时注意修改相关端口号

相关端口映射
8、演示到此,服务端和客户端的连接演示基本功能流程到此结束。下篇我们分析elastic-job敬请期待!
另外xxl-job官方相关文档可参考:参考