• 分布式任务调度-XXL-job


    源码仓库地址

    http://gitee.com/xuxueli0323/xxl-job

    前置环境

    docker容器环境配置

    1. 拉取msyql镜像: docker pull mysql:5.7
    2. 创建mysql容器:
    3. docker run -p 3306:3306 --name mysql57 \
    4. -v /opt/mysql/conf:/etc/mysql \
    5. -v /opt/mysql/logs:/var/log/mysql \
    6. -v /opt/mysql/data:/var/lib/mysql \
    7. -e MYSQL_ROOT_PASSWORD=root \
    8. -d mysql:5.7
    9. 拉取xxl-job镜像:docker pull xuxueli/xxl-job-admin:2.3.0
    10. 创建xxl-job容器:
    11. docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://192.168.74.128:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 \
    12. --spring.datasource.username=root \
    13. --spring.datasource.password=root" \
    14. -p 8888:8080 \
    15. -v /tmp:/data/applogs \
    16. --name xxl-job-admin --restart=always -d xuxueli/xxl-job-admin:2.3.0

    连接linux数据库,并创建任务调度所用到的数据库xxl-job。

    用到的表sql

    1. #
    2. # XXL-JOB v2.3.0
    3. # Copyright (c) 2015-present, xuxueli.
    4. CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
    5. use `xxl_job`;
    6. SET NAMES utf8mb4;
    7. CREATE TABLE `xxl_job_info` (
    8. `id` int(11) NOT NULL AUTO_INCREMENT,
    9. `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
    10. `job_desc` varchar(255) NOT NULL,
    11. `add_time` datetime DEFAULT NULL,
    12. `update_time` datetime DEFAULT NULL,
    13. `author` varchar(64) DEFAULT NULL COMMENT '作者',
    14. `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
    15. `schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型',
    16. `schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',
    17. `misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',
    18. `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',
    19. `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
    20. `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
    21. `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
    22. `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
    23. `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
    24. `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
    25. `glue_source` mediumtext COMMENT 'GLUE源代码',
    26. `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
    27. `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
    28. `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
    29. `trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',
    30. `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',
    31. `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',
    32. PRIMARY KEY (`id`)
    33. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    34. CREATE TABLE `xxl_job_log` (
    35. `id` bigint(20) NOT NULL AUTO_INCREMENT,
    36. `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
    37. `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
    38. `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
    39. `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
    40. `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
    41. `executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
    42. `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
    43. `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
    44. `trigger_code` int(11) NOT NULL COMMENT '调度-结果',
    45. `trigger_msg` text COMMENT '调度-日志',
    46. `handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
    47. `handle_code` int(11) NOT NULL COMMENT '执行-状态',
    48. `handle_msg` text COMMENT '执行-日志',
    49. `alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
    50. PRIMARY KEY (`id`),
    51. KEY `I_trigger_time` (`trigger_time`),
    52. KEY `I_handle_code` (`handle_code`)
    53. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    54. CREATE TABLE `xxl_job_log_report` (
    55. `id` int(11) NOT NULL AUTO_INCREMENT,
    56. `trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',
    57. `running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
    58. `suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
    59. `fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',
    60. `update_time` datetime DEFAULT NULL,
    61. PRIMARY KEY (`id`),
    62. UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
    63. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    64. CREATE TABLE `xxl_job_logglue` (
    65. `id` int(11) NOT NULL AUTO_INCREMENT,
    66. `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
    67. `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
    68. `glue_source` mediumtext COMMENT 'GLUE源代码',
    69. `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
    70. `add_time` datetime DEFAULT NULL,
    71. `update_time` datetime DEFAULT NULL,
    72. PRIMARY KEY (`id`)
    73. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    74. CREATE TABLE `xxl_job_registry` (
    75. `id` int(11) NOT NULL AUTO_INCREMENT,
    76. `registry_group` varchar(50) NOT NULL,
    77. `registry_key` varchar(255) NOT NULL,
    78. `registry_value` varchar(255) NOT NULL,
    79. `update_time` datetime DEFAULT NULL,
    80. PRIMARY KEY (`id`),
    81. KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
    82. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    83. CREATE TABLE `xxl_job_group` (
    84. `id` int(11) NOT NULL AUTO_INCREMENT,
    85. `app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
    86. `title` varchar(12) NOT NULL COMMENT '执行器名称',
    87. `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
    88. `address_list` text COMMENT '执行器地址列表,多地址逗号分隔',
    89. `update_time` datetime DEFAULT NULL,
    90. PRIMARY KEY (`id`)
    91. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    92. CREATE TABLE `xxl_job_user` (
    93. `id` int(11) NOT NULL AUTO_INCREMENT,
    94. `username` varchar(50) NOT NULL COMMENT '账号',
    95. `password` varchar(50) NOT NULL COMMENT '密码',
    96. `role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',
    97. `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
    98. PRIMARY KEY (`id`),
    99. UNIQUE KEY `i_username` (`username`) USING BTREE
    100. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    101. CREATE TABLE `xxl_job_lock` (
    102. `lock_name` varchar(50) NOT NULL COMMENT '锁名称',
    103. PRIMARY KEY (`lock_name`)
    104. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    105. INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' );
    106. INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `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, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
    107. INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
    108. INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock');
    109. commit;

      (1) 打开mysql容器,确保连接的mysql表数据正确

      (2) 打开xxl 容器 

    打开映射网址

    http://192.168.74.128:8888/xxl-job-admin/

    后端配置使用任务调度

    依赖

    1. org.springframework.boot
    2. spring-boot-starter-web
    3. com.xuxueli
    4. xxl-job-core
    5. 2.3.0

    yml配置

    1. server:
    2. port: ${port:8881}
    3. xxl:
    4. job:
    5. admin:
    6. addresses: http://192.168.74.128:8888/xxl-job-admin
    7. executor:
    8. appname: xxl-job-executor-sample
    9. port: ${executor.port:9999}

     使用架构

     config配置

    1. package com.heima.xxljob.config;
    2. import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
    3. import org.slf4j.Logger;
    4. import org.slf4j.LoggerFactory;
    5. import org.springframework.beans.factory.annotation.Value;
    6. import org.springframework.context.annotation.Bean;
    7. import org.springframework.context.annotation.Configuration;
    8. /**
    9. * xxl-job config
    10. *
    11. * @author xuxueli 2017-04-28
    12. */
    13. @Configuration
    14. public class XxlJobConfig {
    15. private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
    16. @Value("${xxl.job.admin.addresses}")
    17. private String adminAddresses;
    18. @Value("${xxl.job.executor.appname}")
    19. private String appname;
    20. @Value("${xxl.job.executor.port}")
    21. private int port;
    22. @Bean
    23. public XxlJobSpringExecutor xxlJobExecutor() {
    24. logger.info(">>>>>>>>>>> xxl-job config init.");
    25. XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
    26. xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
    27. xxlJobSpringExecutor.setAppname(appname);
    28. xxlJobSpringExecutor.setPort(port);
    29. return xxlJobSpringExecutor;
    30. }
    31. }

    job使用

    1. @Component
    2. public class HelloJob {
    3. @Value("${server.port}")
    4. private String port;
    5. @XxlJob("guo")
    6. public void helloJob(){
    7. System.out.println("简单任务执行了。。。。"+port);
    8. }
    9. }

    快速入门使用

    任务调度执行器

     任务调度执行管理

     配置文件为执行器的AppName

     使用任务调度的注解:任务管理的执行器handler

     轮询策略

    切换不同的端口号 

     -Dserver.port=8882 -Dexecutor.port=9997

     

     分片广播

     

    1. package com.heima.xxljob.job;
    2. import com.xxl.job.core.context.XxlJobHelper;
    3. import com.xxl.job.core.handler.annotation.XxlJob;
    4. import org.springframework.beans.factory.annotation.Value;
    5. import org.springframework.stereotype.Component;
    6. import java.util.ArrayList;
    7. import java.util.List;
    8. @Component
    9. public class HelloJob {
    10. @Value("${server.port}")
    11. private String port;
    12. // @XxlJob("gmr")
    13. // public void helloJob(){
    14. // System.out.println("简单任务执行了。。。。"+port);
    15. //
    16. // }
    17. @XxlJob("gmr")
    18. public void helloJob() {
    19. int shardIndex = XxlJobHelper.getShardIndex();
    20. int shardTotal = XxlJobHelper.getShardTotal();
    21. List list = getList();
    22. for (Integer integer : list) {
    23. if (integer % shardTotal == shardIndex) {
    24. System.out.println("当前第" + shardIndex + "分片执行了,任务项为" + integer);
    25. }
    26. }
    27. }
    28. public List getList() {
    29. ArrayList list = new ArrayList<>();
    30. for (int i = 0; i < 1000; i++) {
    31. list.add(i);
    32. }
    33. return list;
    34. }
    35. }

  • 相关阅读:
    Photoshop 2024(ps ai beta) v25.0
    C/C++ 字符串问题总结
    如何在IDEA中创建Module、以及怎样在IDEA中删除Module?
    STM32F103C8T6第二天:按键点灯轮询法和中断法、RCC、电动车报警器(振动传感器、继电器、喇叭、433M无线接收发射模块)
    华为云桌面——云端上“最卷的云”
    Vue3:对ref、reactive的一个性能优化API
    Web缓存
    颗粒归仓水稻总体产量5500吨 国稻种芯-洪江:怀化水稻秋收
    MyBatisPlus详解
    Wireshark 通过 nrf-sniffer for BLE 抓包环境配置说明
  • 原文地址:https://blog.csdn.net/weixin_67573348/article/details/134450761