• 分布式调度xxl-job实战应用解析


    分布式调度xxl-job实战应用解析今天分享,业务场景经常出现分布式定时任务情况,以前经常采用分布式锁解决,不过随着业务场景的复杂度变大,分布式锁的方案开始满足不了很多业务场景,因此这篇文章,我们重点分析实战使用:

    一、xxl-job 的服务端

    服务端集成mysql数据库,数据库初始化几张表,作用和分布式锁相关,数据库配置等等。

    1、数据库脚本

    1. CREATE database if NOT EXISTS `xxl-job` default character set utf8 collate utf8_general_ci;
    2. use `xxl-job`;
    3. CREATE TABLE XXL_JOB_QRTZ_JOB_DETAILS
    4. (
    5. SCHED_NAME VARCHAR(120) NOT NULL,
    6. JOB_NAME VARCHAR(200) NOT NULL,
    7. JOB_GROUP VARCHAR(200) NOT NULL,
    8. DESCRIPTION VARCHAR(250) NULL,
    9. JOB_CLASS_NAME VARCHAR(250) NOT NULL,
    10. IS_DURABLE VARCHAR(1) NOT NULL,
    11. IS_NONCONCURRENT VARCHAR(1) NOT NULL,
    12. IS_UPDATE_DATA VARCHAR(1) NOT NULL,
    13. REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
    14. JOB_DATA BLOB NULL,
    15. PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
    16. );
    17. CREATE TABLE XXL_JOB_QRTZ_TRIGGERS
    18. (
    19. SCHED_NAME VARCHAR(120) NOT NULL,
    20. TRIGGER_NAME VARCHAR(200) NOT NULL,
    21. TRIGGER_GROUP VARCHAR(200) NOT NULL,
    22. JOB_NAME VARCHAR(200) NOT NULL,
    23. JOB_GROUP VARCHAR(200) NOT NULL,
    24. DESCRIPTION VARCHAR(250) NULL,
    25. NEXT_FIRE_TIME BIGINT(13) NULL,
    26. PREV_FIRE_TIME BIGINT(13) NULL,
    27. PRIORITY INTEGER NULL,
    28. TRIGGER_STATE VARCHAR(16) NOT NULL,
    29. TRIGGER_TYPE VARCHAR(8) NOT NULL,
    30. START_TIME BIGINT(13) NOT NULL,
    31. END_TIME BIGINT(13) NULL,
    32. CALENDAR_NAME VARCHAR(200) NULL,
    33. MISFIRE_INSTR SMALLINT(2) NULL,
    34. JOB_DATA BLOB NULL,
    35. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    36. FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
    37. REFERENCES XXL_JOB_QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
    38. );
    39. CREATE TABLE XXL_JOB_QRTZ_SIMPLE_TRIGGERS
    40. (
    41. SCHED_NAME VARCHAR(120) NOT NULL,
    42. TRIGGER_NAME VARCHAR(200) NOT NULL,
    43. TRIGGER_GROUP VARCHAR(200) NOT NULL,
    44. REPEAT_COUNT BIGINT(7) NOT NULL,
    45. REPEAT_INTERVAL BIGINT(12) NOT NULL,
    46. TIMES_TRIGGERED BIGINT(10) NOT NULL,
    47. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    48. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    49. REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    50. );
    51. CREATE TABLE XXL_JOB_QRTZ_CRON_TRIGGERS
    52. (
    53. SCHED_NAME VARCHAR(120) NOT NULL,
    54. TRIGGER_NAME VARCHAR(200) NOT NULL,
    55. TRIGGER_GROUP VARCHAR(200) NOT NULL,
    56. CRON_EXPRESSION VARCHAR(200) NOT NULL,
    57. TIME_ZONE_ID VARCHAR(80),
    58. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    59. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    60. REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    61. );
    62. CREATE TABLE XXL_JOB_QRTZ_SIMPROP_TRIGGERS
    63. (
    64. SCHED_NAME VARCHAR(120) NOT NULL,
    65. TRIGGER_NAME VARCHAR(200) NOT NULL,
    66. TRIGGER_GROUP VARCHAR(200) NOT NULL,
    67. STR_PROP_1 VARCHAR(512) NULL,
    68. STR_PROP_2 VARCHAR(512) NULL,
    69. STR_PROP_3 VARCHAR(512) NULL,
    70. INT_PROP_1 INT NULL,
    71. INT_PROP_2 INT NULL,
    72. LONG_PROP_1 BIGINT NULL,
    73. LONG_PROP_2 BIGINT NULL,
    74. DEC_PROP_1 NUMERIC(13,4) NULL,
    75. DEC_PROP_2 NUMERIC(13,4) NULL,
    76. BOOL_PROP_1 VARCHAR(1) NULL,
    77. BOOL_PROP_2 VARCHAR(1) NULL,
    78. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    79. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    80. REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    81. );
    82. CREATE TABLE XXL_JOB_QRTZ_BLOB_TRIGGERS
    83. (
    84. SCHED_NAME VARCHAR(120) NOT NULL,
    85. TRIGGER_NAME VARCHAR(200) NOT NULL,
    86. TRIGGER_GROUP VARCHAR(200) NOT NULL,
    87. BLOB_DATA BLOB NULL,
    88. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    89. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    90. REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    91. );
    92. CREATE TABLE XXL_JOB_QRTZ_CALENDARS
    93. (
    94. SCHED_NAME VARCHAR(120) NOT NULL,
    95. CALENDAR_NAME VARCHAR(200) NOT NULL,
    96. CALENDAR BLOB NOT NULL,
    97. PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
    98. );
    99. CREATE TABLE XXL_JOB_QRTZ_PAUSED_TRIGGER_GRPS
    100. (
    101. SCHED_NAME VARCHAR(120) NOT NULL,
    102. TRIGGER_GROUP VARCHAR(200) NOT NULL,
    103. PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
    104. );
    105. CREATE TABLE XXL_JOB_QRTZ_FIRED_TRIGGERS
    106. (
    107. SCHED_NAME VARCHAR(120) NOT NULL,
    108. ENTRY_ID VARCHAR(95) NOT NULL,
    109. TRIGGER_NAME VARCHAR(200) NOT NULL,
    110. TRIGGER_GROUP VARCHAR(200) NOT NULL,
    111. INSTANCE_NAME VARCHAR(200) NOT NULL,
    112. FIRED_TIME BIGINT(13) NOT NULL,
    113. SCHED_TIME BIGINT(13) NOT NULL,
    114. PRIORITY INTEGER NOT NULL,
    115. STATE VARCHAR(16) NOT NULL,
    116. JOB_NAME VARCHAR(200) NULL,
    117. JOB_GROUP VARCHAR(200) NULL,
    118. IS_NONCONCURRENT VARCHAR(1) NULL,
    119. REQUESTS_RECOVERY VARCHAR(1) NULL,
    120. PRIMARY KEY (SCHED_NAME,ENTRY_ID)
    121. );
    122. CREATE TABLE XXL_JOB_QRTZ_SCHEDULER_STATE
    123. (
    124. SCHED_NAME VARCHAR(120) NOT NULL,
    125. INSTANCE_NAME VARCHAR(200) NOT NULL,
    126. LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
    127. CHECKIN_INTERVAL BIGINT(13) NOT NULL,
    128. PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
    129. );
    130. CREATE TABLE XXL_JOB_QRTZ_LOCKS
    131. (
    132. SCHED_NAME VARCHAR(120) NOT NULL,
    133. LOCK_NAME VARCHAR(40) NOT NULL,
    134. PRIMARY KEY (SCHED_NAME,LOCK_NAME)
    135. );
    136. CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_INFO` (
    137. `id` int(11) NOT NULL AUTO_INCREMENT,
    138. `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
    139. `job_cron` varchar(128) NOT NULL COMMENT '任务执行CRON',
    140. `job_desc` varchar(255) NOT NULL,
    141. `add_time` datetime DEFAULT NULL,
    142. `update_time` datetime DEFAULT NULL,
    143. `author` varchar(64) DEFAULT NULL COMMENT '作者',
    144. `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
    145. `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',
    146. `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
    147. `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
    148. `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
    149. `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
    150. `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
    151. `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
    152. `glue_source` mediumtext COMMENT 'GLUE源代码',
    153. `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
    154. `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
    155. `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
    156. PRIMARY KEY (`id`)
    157. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    158. CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOG` (
    159. `id` int(11) NOT NULL AUTO_INCREMENT,
    160. `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
    161. `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
    162. `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
    163. `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
    164. `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
    165. `executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
    166. `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
    167. `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
    168. `trigger_code` int(11) NOT NULL COMMENT '调度-结果',
    169. `trigger_msg` text COMMENT '调度-日志',
    170. `handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
    171. `handle_code` int(11) NOT NULL COMMENT '执行-状态',
    172. `handle_msg` text COMMENT '执行-日志',
    173. `alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
    174. PRIMARY KEY (`id`),
    175. KEY `I_trigger_time` (`trigger_time`),
    176. KEY `I_handle_code` (`handle_code`)
    177. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    178. CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOGGLUE` (
    179. `id` int(11) NOT NULL AUTO_INCREMENT,
    180. `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
    181. `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
    182. `glue_source` mediumtext COMMENT 'GLUE源代码',
    183. `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
    184. `add_time` timestamp NULL DEFAULT NULL,
    185. `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
    186. PRIMARY KEY (`id`)
    187. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    188. CREATE TABLE XXL_JOB_QRTZ_TRIGGER_REGISTRY (
    189. `id` int(11) NOT NULL AUTO_INCREMENT,
    190. `registry_group` varchar(255) NOT NULL,
    191. `registry_key` varchar(255) NOT NULL,
    192. `registry_value` varchar(255) NOT NULL,
    193. `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    194. PRIMARY KEY (`id`)
    195. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    196. CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_GROUP` (
    197. `id` int(11) NOT NULL AUTO_INCREMENT,
    198. `app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
    199. `title` varchar(12) NOT NULL COMMENT '执行器名称',
    200. `order` tinyint(4) NOT NULL DEFAULT '0' COMMENT '排序',
    201. `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
    202. `address_list` varchar(512) DEFAULT NULL COMMENT '执行器地址列表,多地址逗号分隔',
    203. PRIMARY KEY (`id`)
    204. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    205. 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);
    206. 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', '');
    207. commit;

    执行后

     

     

    2、springBoot服务引用相关jar

    其实直接拉取源码就行:GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-webartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-freemarkerartifactId>
    8. dependency>
    9. <dependency>
    10. <groupId>org.springframework.bootgroupId>
    11. <artifactId>spring-boot-starter-mailartifactId>
    12. dependency>
    13. <dependency>
    14. <groupId>org.mybatis.spring.bootgroupId>
    15. <artifactId>mybatis-spring-boot-starterartifactId>
    16. <version>${mybatis-spring-boot-starter.version}version>
    17. dependency>
    18. <dependency>
    19. <groupId>mysqlgroupId>
    20. <artifactId>mysql-connector-javaartifactId>
    21. <version>${mysql-connector-java.version}version>
    22. dependency>
    23. <dependency>
    24. <groupId>org.quartz-schedulergroupId>
    25. <artifactId>quartzartifactId>
    26. <version>${quartz.version}version>
    27. dependency>
    28. <dependency>
    29. <groupId>com.xuxueligroupId>
    30. <artifactId>xxl-job-coreartifactId>
    31. <version>2.0.2version>
    32. dependency>

    3、配置文件相关

    1. ### web
    2. server.port=8080
    3. server.context-path=/xxl-job-admin
    4. ### resources
    5. spring.mvc.static-path-pattern=/static/**
    6. spring.resources.static-locations=classpath:/static/
    7. ### freemarker
    8. spring.freemarker.templateLoaderPath=classpath:/templates/
    9. spring.freemarker.suffix=.ftl
    10. spring.freemarker.charset=UTF-8
    11. spring.freemarker.request-context-attribute=request
    12. spring.freemarker.settings.number_format=0.##########
    13. ### mybatis
    14. mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
    15. ### xxl-job, datasource
    16. #spring.datasource.url=jdbc:mysql://192.168.43.174:3306/xxl-job?Unicode=true&characterEncoding=UTF-8&useSSL=false
    17. spring.datasource.url=jdbc:mysql://192.168.43.174:3306/xxl-job?Unicode=true&characterEncoding=UTF-8&useSSL=false
    18. spring.datasource.username=root
    19. spring.datasource.password=root
    20. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    21. spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
    22. spring.datasource.tomcat.max-wait=10000
    23. spring.datasource.tomcat.max-active=30
    24. spring.datasource.tomcat.test-on-borrow=true
    25. spring.datasource.tomcat.validation-query=SELECT 1
    26. spring.datasource.tomcat.validation-interval=30000
    27. ### xxl-job email
    28. spring.mail.host=smtp.qq.com
    29. spring.mail.port=25
    30. spring.mail.username=xxx@qq.com
    31. spring.mail.password=xxx
    32. spring.mail.properties.mail.smtp.auth=true
    33. spring.mail.properties.mail.smtp.starttls.enable=true
    34. spring.mail.properties.mail.smtp.starttls.required=true
    35. ### xxl-job login
    36. xxl.job.login.username=admin
    37. xxl.job.login.password=123456
    38. ### xxl-job, access token
    39. xxl.job.accessToken=
    40. ### xxl-job, i18n (default empty as chinese, "en" as english)
    41. xxl.job.i18n=

    4、启动服务

    1. package com.xxl.job.admin;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. /**
    5. * @author xuxueli 2018-10-28 00:38:13
    6. */
    7. @SpringBootApplication
    8. public class XxlJobAdminApplication {
    9. public static void main(String[] args) {
    10. SpringApplication.run(XxlJobAdminApplication.class, args);
    11. }
    12. }

    启动后访问web控制台:http://localhost:8080/xxl-job-admin

    点击登录

     

     5、点击任务管理器

    点击编辑看看以前注册的三台客户端

     

    也可以删除xxl-enjoy 执行器,重写添加;

    添加前两个参数就行

     

      6、点击任务管理查看以前注册的

    选择nandao,查看其状态

    点击编辑

       点击新增任务

    7、点击调度日志

     查看成功的日志的详情

     

    查看失败的日志的详情

     

    如图

     

    这种失败是因为没有添加配置执行器导致的。 

    8、新增任务

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

     

     点击GLUE编辑

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

     备注

    点击关闭后就可以执行测试了

     

    查看客户端结果

     9、新增分片的业务

    保存后,点击执行测试

    参数

      结果 

     二、xxl-job的客户端

    1、springboot 项目 pom配置

    1. <dependency>
    2. <groupId>com.xuxueligroupId>
    3. <artifactId>xxl-job-coreartifactId>
    4. <version>2.0.2version>
    5. dependency>

    2、配置文件、

    1. ### 调度器的地址----- 发消息
    2. xxl.job.admin.addresses=http://localhost:8080/xxl-job-admin
    3. ### 当前执行器的标识名称,同一个名字的执行器构成集群
    4. xxl.job.executor.appname=xxl-enjoy
    5. # 执行器与调度器通信的ip / port
    6. xxl.job.executor.ip=
    7. #启动多个服务可以暂时改动端口号
    8. xxl.job.executor.port=9991
    9. ### job-job, access token
    10. xxl.job.accessToken=
    11. ### job-job log path
    12. xxl.job.executor.logpath=/logs/xxl/job
    13. ### job-job log retention days
    14. xxl.job.executor.logretentiondays=-1
    15. #启动多个服务可以改端口号
    16. server.port=8281

    3、客户端配置分布式调度

    1. import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
    2. import org.slf4j.Logger;
    3. import org.slf4j.LoggerFactory;
    4. import org.springframework.beans.factory.annotation.Value;
    5. import org.springframework.context.annotation.Bean;
    6. import org.springframework.context.annotation.ComponentScan;
    7. import org.springframework.context.annotation.Configuration;
    8. @Configuration
    9. @ComponentScan(basePackages = "com.xxl.job.executor.service.jobhandler")
    10. public class XxlConfig {
    11. private Logger logger = LoggerFactory.getLogger(XxlConfig.class);
    12. @Value("${xxl.job.admin.addresses}")
    13. private String adminAddresses;
    14. @Value("${xxl.job.executor.appname}")
    15. private String appName;
    16. @Value("${xxl.job.executor.ip}")
    17. private String ip;
    18. @Value("${xxl.job.executor.port}")
    19. private int port;
    20. @Value("${xxl.job.accessToken}")
    21. private String accessToken;
    22. @Value("${xxl.job.executor.logpath}")
    23. private String logPath;
    24. @Value("${xxl.job.executor.logretentiondays}")
    25. private int logRetentionDays;
    26. @Bean(initMethod = "start", destroyMethod = "destroy")
    27. public XxlJobSpringExecutor xxlJobExecutor() {
    28. logger.info(">>>>>>>>>>> job-job config init.");
    29. XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
    30. xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
    31. xxlJobSpringExecutor.setAppName(appName);
    32. xxlJobSpringExecutor.setIp(ip);
    33. xxlJobSpringExecutor.setPort(port);
    34. xxlJobSpringExecutor.setAccessToken(accessToken);
    35. xxlJobSpringExecutor.setLogPath(logPath);
    36. xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
    37. return xxlJobSpringExecutor;
    38. }
    39. }

    4、任务核心

    1. import org.springframework.stereotype.Service;
    2. @Service
    3. public class EnjoyBusiness {
    4. /**
    5. * index指示,现在跑的是第几片
    6. * total指示,总共有几片
    7. */
    8. public void process(int index,int total,String param) {
    9. if (total == 1){
    10. System.out.println("当前执行全业务处理,参数:"+param);
    11. return;
    12. }
    13. //分片任务
    14. if (index == 1 ){
    15. // select * from xxx limit 0,500
    16. } else {
    17. // select * from xxx limit 500,1000
    18. }
    19. System.out.println("当前执行第 "+(index+1)+"/"+total+"片的数据,参数:"+param);
    20. }
    21. }

    5、三种job类型

    常规的

    1. import com.enjoy.business.EnjoyBusiness;
    2. import com.xxl.job.core.biz.model.ReturnT;
    3. import com.xxl.job.core.handler.IJobHandler;
    4. import com.xxl.job.core.handler.annotation.JobHandler;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Component;
    7. /**
    8. * 普通任务
    9. */
    10. @JobHandler(value="enjoySimple") //value值对应的是调度中心新建任务的JobHandler
    11. @Component
    12. public class EnjoySimple extends IJobHandler {
    13. @Autowired
    14. private EnjoyBusiness enjoyBusiness;
    15. @Override
    16. public ReturnT<String> execute(String param) throws Exception {
    17. enjoyBusiness.process(1,1,param);
    18. return SUCCESS;
    19. }
    20. }

    分片的

    1. import com.enjoy.business.EnjoyBusiness;
    2. import com.xxl.job.core.biz.model.ReturnT;
    3. import com.xxl.job.core.handler.IJobHandler;
    4. import com.xxl.job.core.handler.annotation.JobHandler;
    5. import com.xxl.job.core.util.ShardingUtil;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Service;
    8. /**
    9. * 分片任务
    10. */
    11. @JobHandler(value="enjoySharding")
    12. @Service
    13. public class EnjoySharding extends IJobHandler {
    14. @Autowired
    15. private EnjoyBusiness enjoyBusiness;
    16. @Override
    17. public ReturnT<String> execute(String param) throws Exception {
    18. ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
    19. int index = shardingVO.getIndex();
    20. int total = shardingVO.getTotal();
    21. enjoyBusiness.process(index,total,param);
    22. return SUCCESS;
    23. }
    24. }

    动态修改的

    1. import com.xxl.job.core.biz.model.ReturnT;
    2. import com.xxl.job.core.handler.IJobHandler;
    3. public class EnjoyGlue extends IJobHandler {
    4. public ReturnT<String> execute(String param) throws Exception {
    5. System.out.println("测试GLUE任务,我已被执行");
    6. return SUCCESS;
    7. }
    8. }

    6、boot的启动类

    1. package com.enjoy;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import org.springframework.context.annotation.ComponentScan;
    5. @SpringBootApplication
    6. public class XxlJobApp {
    7. public static void main(String[] args) {
    8. SpringApplication.run(XxlJobApp.class, args);
    9. }
    10. }

    其他两个代码一样,类名不同而已。 

    7、依次启动三个客户端,启动时注意修改相关端口号

    相关端口映射

     

     8、演示到此,服务端和客户端的连接演示基本功能流程到此结束。下篇我们分析elastic-job敬请期待!

    另外xxl-job官方相关文档可参考:参考

  • 相关阅读:
    科研常用网站汇总
    笔记:电子设备接地,接的到底是什么地?
    ShardingJDBC:适配OceanBase
    SuperMap 是个什么鬼
    计算机毕设(附源码)JAVA-SSM基于渐进式网页应用的大众社交软件
    搭建RabbitMQ消息服务,整合SpringBoot实现收发消息
    JAVA_SSM+VUE校园二手物品交易平台(含论文)源码
    冒泡排序详解
    阿里也出手了!Spring CloudAlibaba AI问世了
    【说透Redis】如何解决Redis缓存雪崩、击穿与穿透
  • 原文地址:https://blog.csdn.net/nandao158/article/details/126103066