xxl-job|2.springboot集成xxl-job执行器
上一篇讲述了如何在docker中部署xxl-job调度中心,
这一篇就是讲述springboot如何集成xxl-job作为执行器
1.导入pom
(此处一定一定要注意和调度中心的版本要保持一致)
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
2.appliaction.yml中加上如下配置
server:
port: 8081
xxl:
job:
accessToken:
default_token
admin:
addresses: http://127.0.0.1:9051/xxl-job-admin
executor:
address:
appname: xxl-job-invoice-api
ip:
logpath: /data/applogs/xxl-job/jobhandler
logretentiondays: 30
port: 9990
addresses:调度中心地址,如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调",为空则关闭自动注册。(此处127.0.0.1可以替换为自己的服务器地址,9051是服务器docker中部署xxl-job的端口号)
appname:执行器 ,执行器心跳注册分组依据,为空则关闭自动注册
ip:默认为空表示自动获取,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用,地址信息用于 “执行器注册” 和 “调度中心请求并触发任务”
port:执行器端口号,小于等于0则自动获取,默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口
logpath:执行器运行日志文件存储磁盘路径 ,需要对该路径拥有读写权限,为空则使用默认路径
logretentiondays:执行器日志保存天数 [选填] ,值大于3时生效,启用执行器Log文件定期清理功能,否则不生效
accessToken:执行器通讯,(要与调度中心的代码配置一致,目前源码的默认token为(default_token)。配置出错会出现以下token不一致的情况:
>>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='xxl-job-invoice-api', registryValue='http://xxxxxx:9990/'}, registryResult:ReturnT [code=500, msg=The access token is wrong., content=null]
3.执行器配置
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;
@Bean
public 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;
}
}
4.编写定时任务
import cn.hutool.core.date.DateUtil;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* XxlJob开发示例(Bean模式)
*
* 开发步骤:
* 1、任务开发:在Spring Bean实例中,开发Job方法;
* 2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
* 3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
* 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
*
* @author xuxueli 2019-12-11 21:52:51
*/
@Slf4j
@Component
public class JobSample {
/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob(value = "duZhuoJob1")
public ReturnT<String> startJob2(String param) {
log.info(">>>>>>>>>>>>>>>>>" + DateUtil.now() + " param: " + param + ">>>>>>>>>>>>执行");
System.out.println("duZhuoJob1 is success");
return ReturnT.SUCCESS;
}
}
此处为BEAN模式(方法形式),具体说明可参考官方学习文档分布式任务调度平台XXL-JOB
问题:在后面调度中心查询日志时,发现没有打印对应的日志
解决方法:
这是因为日志的输出方式不对,需要通过 "XxlJobHelper.log" 打印执行日志,以下是修正后的:
@Component
public class JobSample {
/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob(value = "duZhuoJob1")
public ReturnT<String> startJob2(String param) {
XxlJobHelper.log(">>>>>>>>>>>>>>>>>" + DateUtil.now() + " param: " + param + ">>>>>>>>>>>>执行");
System.out.println("duZhuoJob1 is success");
return ReturnT.SUCCESS;
}
}
此时调度平台日志输出没有问题
原因:
调度中心获取日志的方式是根据xxl_job_log记录的id,执行器yml文件中的logpath地址相互关联
5.调度中心进行配置执行器
配置执行器,AppName要与执行器yml文件中的appname保持一致,名称自选。
对于注册方式,如果调度中心和执行器是本地服务可以选择自动注册
对于发布到服务器的,选择手动录入,机器地址修改为服务器地址,端口号为yml中的执行器port
6.配置任务
执行器选择5中配置的执行器;任务描述可以随意编写;调度类型选择cron,定时执行;运行模式需要选择BEAN模式;JobHandler需要对应上定时任务的注解值
7.调度日志
没有按照1-6步骤开发配置时,查询调度日志遇到如下两个问题
1.调度结果失败,没执行成功
msg:xxl-job remoting error(connect timed out), for url
解决方式:
将执行器服务打包放到服务器上,再修改执行器的机器地址
原因:
执行器一开始是在本地启动,调度中心上配置的执行器地址也是本地地址,而调度中心是在服务器上。服务器telnet本地接口时失败,只能把项目发服务器上可以调通。springboot项目发服务器可参考
简单将Springboot项目部署到linux服务器上_独酌先生QAQ的博客-CSDN博客
如果执行器和调度中心都是本地服务,一般不会有这问题
2.调度成功,执行失败
解决方式:
对比执行器和调度器的版本是否一致
原因:
一开始执行器的引用依赖是2.2.0版本,而调度中心是拉取docker最新版本,版本不一致导致执行器已经执行任务,但是调度中心没有收到执行器返回的成功信息。
更多推荐
所有评论(0)