1 初始化“调度数据库”
地址:https://github.com/xuxueli/xxl-job/blob/master/doc/db/tables_xxl_job.sql
2 部署“调度中心”
docker pull xuxueli/xxl-job-admin:2.2.0
docker run --restart always -e PARAMS="--spring.datasource.url=jdbc:mysql://ip:port/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" -p 8089:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:2.2.0
访问 http://192.168.0.36:8089/xxl-job-admin/
admin 123456
3 部署“执行器项目”
3.1 maven
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
3.2 执行器配置
application.properties
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://ip:port/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=task-course
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/opt/logs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30
3.3 执行器组件配置
package com.aa.task.bb.config
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
/**
* @program: xxxx
*
* @description: XxlJobConfig
*
* @author: loulvlin
*
* @create: 2020-07-23 13:18
**/
@Configuration
class XxlJobConfig {
/** logger */
val logger = LoggerFactory.getLogger(this.javaClass)
@Value("\${xxl.job.admin.addresses}")
private val adminAddresses: String? = null
@Value("\${xxl.job.accessToken}")
private val accessToken: String? = null
@Value("\${xxl.job.executor.appname}")
private val appname: String? = null
@Value("\${xxl.job.executor.address}")
private val address: String? = null
@Value("\${xxl.job.executor.ip}")
private val ip: String? = null
@Value("\${xxl.job.executor.port}")
private val port = 0
@Value("\${xxl.job.executor.logpath}")
private val logPath: String? = null
@Value("\${xxl.job.executor.logretentiondays}")
private val logRetentionDays = 0
@Bean
fun xxlJobExecutor(): XxlJobSpringExecutor {
logger.info(">>>>>>>>>>> xxl-job config init.")
val xxlJobSpringExecutor = 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
}
}
3.4 job开发
package com.aa.task.bb.job
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
import com.xxl.job.core.biz.model.ReturnT
import com.xxl.job.core.handler.annotation.XxlJob
import com.xxl.job.core.log.XxlJobLogger
import org.springframework.stereotype.Component
import java.text.SimpleDateFormat
import javax.annotation.Resource
/**
* @program: xxx
*
* @description: EvaluationLikeJob
*
* @author: loulvlin
*
* @create: 2020-07-23 10:43
**/
@Component
class EvaluationLikeJob {
@Resource
lateinit var evaluationLikeService: IEvaluationLikeService
@Resource
lateinit var redisUtil: RedisUtil
@XxlJob("likeJobHandler")
@Throws(Exception::class)
fun likeJobHandler(param: String): ReturnT<String> {
XxlJobLogger.log("XXL-JOB, likeJobHandler begin")
var likeList = ArrayList<EvaluationLike>()
var evaluationLike: EvaluationLike
var resultMap = redisUtil.hgetAll("like")
var keyTemp:String
var keyListTemp:List<String>
if (resultMap.isNotEmpty()) {
resultMap.forEach {
evaluationLike = EvaluationLike()
keyTemp = it.key.toString()
keyListTemp = keyTemp.split(":")
evaluationLike.evaluationId = keyListTemp[0].toInt()
evaluationLike.userId = keyListTemp[1].toInt()
evaluationLike.valid = keyListTemp[2]
evaluationLike.createTime = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(it.value.toString())
likeList.add(evaluationLike)
}
}
evaluationLikeService.saveOrUpdateBatch(likeList)
return ReturnT.SUCCESS
}
@XxlJob("clearLikeJobHandler")
@Throws(Exception::class)
fun clearLikeJobHandler(param: String): ReturnT<String> {
XxlJobLogger.log("XXL-JOB, clearLikeJobHandler begin")
evaluationLikeService.remove(QueryWrapper<EvaluationLike>().eq("valid",0))
return ReturnT.SUCCESS
}
}
3.5 jar包部署运行
启动日志
2020-07-23 14:38:24.678 INFO - [main] c.x.j.c.e.XxlJobExecutor.registJobHandler(168): >>>>>>>>>>> xxl-job register jobhandler success, name:likeJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@57b130f6[class com.aos.task.cource.job.EvaluationLikeJob#likeJobHandler]
2020-07-23 14:38:24.678 INFO - [main] c.x.j.c.e.XxlJobExecutor.registJobHandler(168): >>>>>>>>>>> xxl-job register jobhandler success, name:clearLikeJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@67e4928c[class com.aos.task.cource.job.EvaluationLikeJob#clearLikeJobHandler]
2020-07-23 14:38:24.783 INFO - [Thread-34] c.x.j.c.s.EmbedServer.run(86): >>>>>>>>>>> xxl-job remoting server start success, nettype = class com.xxl.job.core.server.EmbedServer, port = 9999
4 调度中心配置任务
4.1 创建执行器
AppName is xxl.job.executor.appname=task-course
4.2 创建任务
JobHandler is @XxlJob(“likeJobHandler”)中的likeJobHandler
4.3 任务启动测试
- 任务管理 操作 执行一次
- 调度日志 查看最新日志