扩展------分布式调度任务框架XXL-JOB

目录

  • 定时任务
  • 定时任务的应用场景
  • 定时任务的实现方式
  • 为什么要使用Xxl-job?有什么优点
  • Springboot整合Xxl-job 
  • 1、下载源码
  • 2、配置admin,构建镜像部署在Centos上
  • 3、执行器服务
  • 4、admin调度中心创建执行器
  • 5、基于OpenJDK镜像部署Java应用程序
  • 创建一个新SpringBoot工程将Xxl-job整合进去

定时任务

         在我们的java应用程序中,可以设定在特定的时间点或按照一定的时间间隔自动执行的任务。

定时任务的应用场景

        用户画像:大数据时代,比如淘宝我们的浏览记录都会被埋点,然后定时的在一个时间段(一般是选择凌晨)去分析给用户打标签tag,然后再进行定向推荐。

        消息推送: 比如库存到期,证照合同到期,网点生命周期到期,需要做提前的消息提醒,可以设置定时任务每天去检查是否有即将到期的,然后进行消息推送。

        数据报表:每天设置定时任务让系统自动生成数据报表进行数据统计。

        状态同步:比如一个外卖平台或者物流平台,用户确认到货后,但是店员这边还没确定订单完成,订单状态一直为派送中,可设置定时任务每天凌晨去检查更新。

        日志清除:可以每隔一个星期或者几天去检查系统日志文件的大小,如果过大进行清理或者持久化。

定时任务的实现方式

1、Java原生的Timer类

2、线程池技术中ScheduleExecutorService

3、Spring Task,通过@schedule实现

4、Quartz

5、Elastic-job

6、Xxl-job

为什么要使用Xxl-job?有什么优点?缺点?

①Timer类功能简单、仅支持简单的定时任务,缺乏任务管理和监控功能,不可靠。

②ScheduleExecutorService是通过Executors创建出来的,阿里开发手册中规定不能使用这种方式创建线程池,因为其最大线程数为无限大,使用不当会导致OOM。

③SpringTask也是功能有限,缺乏任务管理和监控功能,并且不适合分布式架构,只适合单体。

④Quarzt的话实现比较复杂,Elastic-job是基于uarzt重构的,还引入了Zookeeper,实现也比较复杂

xxl-job的优点:

①可视化管理界面,提供直观、易用的可视化管理界面,方便我们统一进行管理和监控任务。

②支持分布式任务调度。使用分布式环境,也支持集群分布式架构,可保证高可用性和可靠性。

③任务日志的记录和查看。

④简单且动态,学习简单,上手即用,可动态调整任务状态、启动/停止。

⑤任务监控和报警,提供了丰富的任务监控功能,可以实时查看任务的执行状态、执行日志和执行结果。同时,它还支持任务执行失败时的报警通知,可以通过邮件、短信等方式及时通知相关人员进行处理。

⑥社区活跃。

xxl-job缺点:

①xxl-job通常会将任务信息、执行历史记录等数据存储在数据库中。当任务数量众多且任务执行频繁时,数据库的读写压力会增大。如果数据库的性能不够优化,可能会导致数据存储和查询的延迟。

②并且调度中心是通过DB锁来保证执行任务的唯一性,如果任务较多,数据库锁竞争激烈会导致性能下降

Springboot整合Xxl-job 

部署运行环境: jdk8 + centos7 + docker  + docker-mysql(自行拉取镜像创建容器,比较简单)

1、下载源码

    xxl-job-2.4.1源码下载地址

2、配置admin,构建镜像部署在Centos上

配置数据库,在Mysql中执行项目中自带的sql脚本:

修改xxl-job-admin中配置文件application.properties:

测试启动:

更改Dockerfile文件:

打包:

 将Dockerfile和target文件夹全都上传到CentOS上:

构建镜像,并启动 xxl-admin调度中心:

docker build -t xxl-job-admin:1.0 .

docker run -it -d --name xxl-job-admin -p 8080:8080 admin:1.0

访问CentOS地址:8080/xxl-job-admin:

 

3、执行器服务

编写application.porperties文件:

# web port
server.port=8081
# no web
#spring.main.web-environment=false# log config
logging.config=classpath:logback.xml### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://192.168.136.132:8080/xxl-job-admin### xxl-job, access token
xxl.job.accessToken=default_token### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-test
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=0
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

编写XxlJobConfig文件:

@Configuration
public class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.appname}")private String appname;@Value("${xxl.job.executor.address}")private String address;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}
}

编写执行器任务代码:

@Component
public class SampleXxlJob {@XxlJob("MyJobHandler")public void demoJobHandler() throws Exception {System.out.println(new Date());}
}

 先在本地启动项目:

4、admin调度中心创建执行器

如果是在本地跑执行器程序/业务程序,机器地址必须填电脑的IP地址,否则出现下面的错误:

正确执行:

5、基于OpenJDK镜像部署Java应用程序

我们项目开发完成之后如果要部署在CentOS中,我们使用基于OpenJDK镜像方式运行:

docker pull openjdk:8

 将我们的应用程序代码打包,上传到CentOS指定目录下:

 通过jdk镜像运行jar包,启动应用程序:

docker run --name job-demo -p 8081:8081 -p 9999:9999 
-d -v /home/zzl/server/jars/xxl-job:/jar openjdk:8 
java -jar /jar/xxl-job-executor-sample-springboot-2.4.1.jar 

此时需要将admin调度中心的执行器的地址修改:

启动定时任务:

查看输出日志,定时任务成功启动:

docker logs -f --tail 20 job-demo 

创建一个新SpringBoot工程将Xxl-job整合进去

只需要引入核心依赖: 

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.4.1</version>
</dependency>

application.properties配置文件: 

# web port
server.port=8088
# no web
#spring.main.web-environment=false# log config
logging.config=classpath:logback.xml### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://192.168.136.132:8080/xxl-job-admin### xxl-job, access token
xxl.job.accessToken=default_token### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-test
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=0
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

xxl-job配置类: 

package com.example.realdemo.demos.web.config;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.Configuration;@Configuration
public class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.appname}")private String appname;@Value("${xxl.job.executor.address}")private String address;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}
}

controller层:

@RestController
public class BasicController {@Autowiredprivate BasicService basicService;@RequestMapping("/createTask")public String createTask() {basicService.createTask();return "成功创建任务!";}
}

service层:

@Service
public class BasicService {@XxlJob("createTaskHandler")public void createTask() {System.out.println("这是我新创建的项目,现在是北京时间:" + new Date());}
}

启动项目,去调度中心创建执行器:

创建任务:

启动定时任务,成功运行!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143336.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

muduo - 概要简述

作者&#xff1a;陈硕 编程语言&#xff1a;C 架构模式&#xff1a;Reactor 代码链接&#xff1a;GitHub - chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C11 设计自述&#xff1a;https://www.cnblogs.com/Solstice/archive/2010/08…

交流电力控制电路之交流调压电路

目录 一、单相交流调压电路 1. 相控调压电路 2. 斩控调压电路 二、三相交流调压电路 1. 星形联结&#xff08;Y型联结&#xff09; 2. 支路控制三角形联结 交流变交流大纲 交流调压电路用于调节交流电的输出电压&#xff0c;广泛应用于照明、加热、电机调速等领域。根据不…

cesium入门到精通(9) 添加物体

如何在 一个点中 添加一个物体呢 我先把整体代码 粘贴在这里 <template><div id"cesiumContainer" ref"cesiumContainer"></div> </template><script setup> // yarn add cesium // 将cesium目录下的Build/Cesium4个目录拷…

阿里国际、eBay、乐天等跨境电商如何搭建测评系统给自己店铺测评

要实现自己养号给自己店铺进行测评&#xff0c;确实需要一系列周密的准备和规划&#xff0c;以确保整个过程既稳定安全又有效。以下是详细补充和强化建议&#xff1a; 1. 稳定的测评环境系统 选择高级防关联技术&#xff1a;除了使用国外的服务器、纯净的国外IP和防关联浏览器…

【逐行解析】PSINS工具箱中的UKF组合导航的代码解析(test_SINS_GPS_UKF_153)

详解工具箱的UKF153代码&#xff0c;最后给出运行结果的解读和代码修改思路 文章目录 工具箱程序简述函数详解运行结果解读修改思路修改后的结果 工具箱 本程序需要在安装工具箱后使用&#xff0c;工具箱是开源的&#xff0c;链接&#xff1a;http://www.psins.org.cn/kydm …

十三 系统架构设计(考点篇)

1 软件架构的概念 一个程序和计算系统软件体系结构是指系统的一个或者多个结构。结构中包括软件的构件&#xff0c;构件 的外部可见属性以及它们之间的相互关系。 体系结构并非可运行软件。确切地说&#xff0c;它是一种表达&#xff0c;使软件工程师能够&#xff1a; (1)分…

猎板PCB大讲堂——全球电子产品中PCB阻燃性能的法规与标准概述

今天猎板PCB来说说PCB的板材的阻燃性&#xff01;猎板发现有些PCB平台在售的板厂大多为非阻燃系列&#xff0c;而在许多国家和地区&#xff0c;电子产品及其组件&#xff0c;包括印刷电路板&#xff08;PCB&#xff09;&#xff0c;都必须遵守严格的安全标准&#xff0c;其中包…

面试官:你们是如何在数据库中存储密码?

我有一个朋友&#xff0c;姑且就先称呼他为小王吧&#xff0c;前几日&#xff0c;小王去面试&#xff1b; 面试官问&#xff1a;如何在数据库中存储密码&#xff1f; 场景&#xff1a; 小王是应聘者&#xff0c;张总是面试官&#xff0c;面试主要围绕密码存储和相关的安全技术…

基于PHP+MySQL组合开发的在线客服源码系统 聊天记录实时保存 带完整的安装代码包以及搭建部署教程

系统概述 随着互联网技术的飞速发展&#xff0c;企业与客户之间的沟通方式日益多样化&#xff0c;在线客服系统作为连接企业与客户的桥梁&#xff0c;其重要性不言而喻。然而&#xff0c;市场上现有的在线客服系统往往存在成本高、定制性差、维护复杂等问题。针对这些痛点&…

idea插件开发的第四天-完善JSON工具

介绍 Demo说明 本文基于maven项目开发,idea版本为2022.3以上,jdk为1.8本文在Tools插件之上进行开发本次demo将使用idea的一些组件优化 Tools插件说明 Tools插件是一个Idea插件,此插件提供统一Spi规范,极大的降低了idea插件的开发难度,并提供开发者模块,可以极大的为开发者开…

C++源代码封装成dll动态链接库,并在WPF项目中使用的步骤说明

文章目录 1. 创建并生成C的DLL&#xff08;C动态链接库&#xff09;&#xff08;1&#xff09;新建项目-->开发语言选定C&#xff0c;在搜索栏搜索“动态链接库”-->配置项目名称和路径-->添加类&#xff0c;此处命名为My_C_Class&#xff08;2)实现类的功能&#xff…

Logstash 安装与部署(无坑版)

下载 版本对照关系&#xff1a;ElasticSearch 7.9.2 和 Logstash 7.9.2 &#xff1b; 官方下载地址 选择ElasticSearch版本一致的Logstash版本 https://www.elastic.co/cn/downloads/logstash 下载链接&#xff1a;https://artifacts.elastic.co/downloads/logstash/logst…

Flask-WTF的使用

组织一个 Flask 项目通常需要遵循一定的结构&#xff0c;以便代码清晰、可维护。下面是一个典型的 Flask 项目结构&#xff1a; my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── views.py │ ├── forms.py │ ├── templat…

什么样的无线麦克风好?罗德、西圣、优篮子无线麦克风实测对比

在这个人人都在用短视频分享记录生活的时代&#xff0c;拍摄生活Vlog和短视频已经深入我们生活的方方面面&#xff0c;美食分享、搞笑视频以及直播等等&#xff0c;不过既然说到视频创作&#xff0c;那么光有好的内容画面肯定是远远不够的&#xff0c;试想一段视频里杂音不断&a…

单片机带隙电压基准电路

单片机带隙电压基准电路 一、带隙电压基准电路概述 带隙电压基准电路在单片机中占据着至关重要的地位。它能够为各种模拟集成电路提供稳定的参考电压&#xff0c;确保电路的正常运行。例如&#xff0c;在高精度的比较器中&#xff0c;带隙电压基准电路可以提供一个精确的参考…

【可测试性实践】C++单元测试:gtest gmock

引言 google test是目前C主流的单元测试框架&#xff0c;本文介绍如何在工程引入gtest和gmock&#xff0c;并提供入门参考示例。根据黄金圈思维我们先思考Why&#xff08;为什么做&#xff09;&#xff0c;为什么我们要进行单元测试&#xff0c;为什么要引入mock手段来测试代码…

IBM中国研发部裁员:全球化背景下的中国IT产业挑战与机遇

文章目录 每日一句正能量前言整体分析人才发展裁员对中国IT人才市场的影响&#xff1a;IT从业者提升竞争力的策略&#xff1a; 产业未来后记 每日一句正能量 一切美好的事物都是曲折地接近自己的目标&#xff0c;一切笔直都是骗人的&#xff0c;所有真理都是弯曲的&#xff0c;…

设计一个高质量的API接口:提升应用性能的关键步骤

在当今的软件开发世界中&#xff0c;API&#xff08;应用程序编程接口&#xff09;接口扮演着至关重要的角色。一个设计精良的API不仅能够提高开发效率&#xff0c;还能提升用户体验&#xff0c;并确保系统的可扩展性和安全性。本文将探讨如何设计一个高质量的API接口&#xff…

蓝卓标杆客户镇洋发展,荣获IDC中国未来企业大奖

9月11-12日&#xff0c;2024 IDC中国年度盛典暨颁奖典礼在上海正式举办&#xff0c;年度盛典公布了2024 IDC中国未来企业大奖等系列奖项&#xff0c;以此表彰不同机构/组织/个人在数字化转型大背景下的努力与成绩。 其中&#xff0c;浙江镇洋发展股份有限公司&#xff08;以下简…

【sgCreateCallAPIFunction】自定义小工具:敏捷开发→调用接口方法代码生成工具

<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">调用接口方法定义列表</div…