spring项目整合xxl-job
背景
当你的项目中还在使用配置管理定时任务时,为了提高效率,提高可用性,你就需要一个可以可视化的定时任务管理工具来对项目进行管理,而xxl-job就不错的选择。
准备工作
环境和版本确定
这里选择:xxl-job-admin-2.3.1版本、需要用到了jdk1.8
项目地址:https://gitee.com/xuxueli0323/xxl-job/tree/2.3.1/
项目地址:xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB) (github.com)
xxl-job-admin项目配置修改
xxl-job-admin项目中的application.properties 关键配置修改:
### web
server.port=8099
server.servlet.context-path=/xxl-job-admin
### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false
### resources
spring.mvc.servlet.load-on-startup=0
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
#mybatis.type-aliases-package=com.xxl.job.admin.core.model
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=[email protected]
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
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### xxl-job, access token
xxl.job.accessToken=default_token
### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN
## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### xxl-job, log retention days
xxl.job.logretentiondays=30
注意:目前只需要修改端口、数据库连接地址(用户名、密码)、accessToken
项目整合xxl-job
项目环境:jdk1.8、idea2022.2.2
项目目录结构
project # 项目名称
├── src
│ └── com # 存放Java源代码
│ └── example
│ └── Foo.java
├── resources # 存放项目所需的资源(例如配置文件等)
└── webapp # 存放Web应用程序的文件 (名称可自定义)
│ └── WEB-INF
│ ├── lib # 存放jar包的地方
│ ├── web.xml # 项目的主配置文件
│ └── views # 存放JSP页面和静态资源
├── test # # 存放测试代码
└── README.md # 项目的说明文档
依赖添加
记得将xxl-job-core-2.3.1.jar引入到项目lib中。
如你使用的maven,那就添加对应的依赖到pom.xml
配置修改
修改对应的配置在resouce目录下可自行修改
如你使用的是springboot项目,那就容易多了,就不需要这么繁琐的配置文件了。
xxl-job-executor.properties
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8099/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=default_token
### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### 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=9999
### 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.admin.addresses :与启动xxl-job-admin项目启动运行的地址对应
xxl.job.accessToken: 与启动xxl-job-admin项目中配置的accessToken对应
xxl.job.executor.appname:执行器的名称自定义,后面配置xxl-job执行器管理会使用到
applicationcontext-xxl-job.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="fileEncoding" value="utf-8" />
<property name="locations">
<list> <value>classpath*:xxl-job-executor.properties</value>
</list> </property> </bean>
<!-- ********************************* 基础配置 ********************************* -->
<!-- 配置01、JobHandler 扫描路径,更改为自己新建的SampleXxlJob类所在包的路径 -->
<context:component-scan base-package="com.xxl.job.executor.service.jobhandler" />
<!-- 配置02、执行器 -->
<bean id="xxlJobSpringExecutor" class="com.xxl.job.core.executor.impl.XxlJobSpringExecutor" >
<!-- 执行器注册中心地址[选填],为空则关闭自动注册 -->
<property name="adminAddresses" value="${xxl.job.admin.addresses}" />
<!-- 访问令牌[选填],非空则进行匹配校验 -->
<property name="accessToken" value="${xxl.job.accessToken}" />
<!-- 执行器AppName[选填],为空则关闭自动注册 -->
<property name="appname" value="${xxl.job.executor.appname}" />
<!-- 注册地址[选填],优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址 -->
<property name="address" value="${xxl.job.executor.address}" />
<!-- 执行器IP[选填],为空则自动获取 -->
<property name="ip" value="${xxl.job.executor.ip}" />
<!-- 执行器端口号[选填],小于等于0则自动获取 -->
<property name="port" value="${xxl.job.executor.port}" />
<!-- 执行器日志路径[选填],为空则使用默认路径 -->
<property name="logPath" value="${xxl.job.executor.logpath}" />
<!-- 日志保存天数[选填],值大于3时生效 -->
<property name="logRetentionDays" value="${xxl.job.executor.logretentiondays}" />
</bean>
</beans>
这里只需要修改: <context:component-scan base-package="com.xxl.job.executor.service.jobhandler" /> 对应的扫描包
XxlJob开发示例类
SampleXxlJob
package com.xxl.job.executor.service.jobhandler;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* XxlJob开发示例(Bean模式)
*
* 开发步骤:
* 1、在Spring Bean实例中,开发Job方法,方式格式要求为 "public ReturnT<String> execute(String param)"
* 2、为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
* 3、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;
*/
@Component
public class SampleXxlJob {
private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);
/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob("demoJobHandler")
public ReturnT<String> demoJobHandler(String param) throws Exception {
for (int i = 0; i < 5; i++) {
logger.info("test:"+i);
TimeUnit.SECONDS.sleep(2);
}
return ReturnT.SUCCESS;
}
}
@XxlJob("demoJobHandler") :这里的demoJobHandler会在任务管理器中使用到。 当你执行点执行时,就会触发demoJobHandler方法
web.xml
原本的web.xml配置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
web.xml修改后为:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-*.xml</param-value>
</context-param>
这里时匹配applicationContext前缀的xml文件,进行加载对应的配置。
xxl-job使用
参考我的另外一篇教程。
附件
最后说明一下项目,本项目是使用eclipse编写的,如使用idea打开,就需要修改相应的环境配置,使用的技术栈有:spring、mybaits、Oracle、mongdb、quartz等。在整合xxl-job时,并不能直接按照项目来配置。