Java - SpringBoot整合Xxl-job实现定时任务

建议阅读前可先参考文章链接

Linux - Linux安装部署xxl-job

Java -- XXL-JOB分布式任务调度平台

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

如果是单机并且定时任务不多的情况,可以选择Timer注解@Scheduled或者Cron工具类等方式来实现,但是这有个缺点,那就是定时任务会写死在代码中,一旦启动,就不能暂停或者修改。如果修改的话,整个还项目要重新编译,这属实非常的麻烦。

一、部署xxl-job调度中心

(一)下载源码

xxl-job源码地址: 

GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)

2.4.1版本为例:https://github.com/xuxueli/xxl-job/archive/refs/tags/2.4.1.tar.gz 

xxl-job文档地址: 

分布式任务调度平台XXL-JOB

(二)初始化数据库

找到xxl-job安装包xxl-job-2.4.1/doc/db/路径下的tables_xxl_job.sql文件,连接到mysql数据库,导入到mysql中

 执行sql脚本后,会生成以下8张表:

(三)修改配置文件application.properties

1、修改server.port,服务端口号

2、修改数据库的URL和账号密码

然后打包上传,并运行jar包,使服务运行起来

地址栏输入http://IP或者域名:8666/xxl-job-admin/

 xxl-job-admin 账号:admin 密码:123456 (初始状态下)

二、部署SpringBoot项目

(一)引入Maven依赖 

        <!-- SpringBoot集成Xxl-Job -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.4.1</version>
        </dependency>

(二)修改SpringBoot项目关于xxl-job的配置文件

在我们的springboot项目的 application-dev.yml 配置文件中新增xxl-job配置信息

注:

如果 accessToken 不设置的话,最好把它注释掉,或者 输入xxl-job 默认的 default_token ,否则调用的时候容易引起获取不到token的报错

注:

1、xxl.job.admin.address是xxl-job-admin服务部署的IP地址

2、确认执行器的注册地址正确无误。检查两个地址是否均正确录入并与执行器实际部署的地址对应。

3、确认执行器的注册成功。可以在xxl-job-admin的"执行器管理"页面确认两个执行器均处于在线状态。

4、检查任务调度配置。在任务调度配置中,确保你的任务绑定了正确的执行器,并且任务的JobHandler名称与执行器中注册的JobHandler名称一致。

【1】在xxl-job-admin的"任务管理"页面,找到你的任务并编辑

【2】在任务编辑页面的"基本设置"中,确认"任务路由策略"选择了"单一机器"或"故障转移",以便指定任务绑定的执行器

【3】在"GLUE类型"为Bean模式下,确保"JobHandler"字段的值与执行器中注册的JobHandler名称完全匹配

5、检查执行器配置。在执行器部署的服务器上,确认xxl.job.executor.appname、xxl.job.executor.address和xxl.job.executor.ip等属性的配置与xxl-job-admin上的执行器配置一致

【1】确认执行器的appname与xxl-job-admin中的执行器配置相同

【2】确认执行器的address和ip与xxl-job-admin中的执行器配置相同

【3】执行器即SpringBoot项目中带有@XxlJob("xxlJobTest")注解,执行器的IP地址即SpringBoot项目中带有@XxlJob("xxlJobTest")注解部署服务的IP地址!!!

# Xxl-Job分布式定时任务调度中心
xxl:
  job:
    admin:
      # 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。 
      addresses: http://localhost:8666/xxl-job-admin
      # addresses: http://IP:8666/xxl-job-admin
    # 执行器通讯TOKEN [选填]:非空时启用 系统默认 default_token
    accessToken: default_token
    executor:
      # 执行器的应用名称
      appname: test-xxl-job
      # 执行器注册 [选填]:优先使用该配置作为注册地址
      address: 
      # 执行器IP [选填]:默认为空表示自动获取IP
      ip: 
      # 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999
      port: 9999
      # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
      logpath: D:\Codes\logs
      #logpath: /data/logs/mls/job
      # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
      logretentiondays: 7

(三)创建配置类

/**
 * xxlJob
 */
@Slf4j
@Configuration
public class XxlJobConfig {
    @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() {
        log.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;
    }
}

(四)创建执行器

@Slf4j
@Component
public class XxlJobTest {

    @XxlJob("xxlJobTest")
    public ReturnT<String> xxlJobTest(String date) {
//        log.info("---------xxlJobTest定时任务执行成功--------");
        System.out.println("---------xxlJobTest定时任务执行成功--------");
        return ReturnT.SUCCESS;
    }

}

三、通过调度中心进行任务调度

(一)执行器管理--新增执行器

(二)任务管理--新增任务

(三)任务调度中心发起任务调度

四、配置告警邮件通知

项目上线后,调度任务执行失败,当无告警信息时,只有再数据出现错误,进行问题定位和分析时,才会知道执行结果信息,每次出现问题,不能及时的知晓对于运维而言,很不友好。

但是xxl-job中具备这个能力,具体配置项参考下面详细信息。

xxl-job-admin服务配置
在application.properties中针对邮件告警配置项有如下信息:

### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxxx@qq.com
spring.mail.from=xxxx@qq.com
spring.mail.password=xxxxx
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

这里的配置信息,是配置一个邮件发送方信息。也就是:出现告警信息时,邮件发送者。

这里用的是我个人的QQ邮箱。但这里需要注意一点:

spring.mail.password 不是设置密码,是设置 授权码

邮件授权码

进入QQ邮箱的设置,找到账户

在账户项中下滑至POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。


选择生成授权码。需要发送确认短信信息,当发送成功后,将会获得当前邮箱的授权码信息。
将授权码信息复制粘贴到spring.mail.password中即可!

具体使用

五、常见问题

1、报错 msg:job handler [demoJobHandler] not found.

这个问题有多重因素,要逐个排查

1、执行器地址对不对

2、jobHandler的名称对不对

3、jobConfig是否加载

4、jobHandler是否加载

XxlJobConfig 确认是否加载
发现果然没有加载,这个是启动的时候就加载。

@XxlJob(“demoJobHandler”) 所在类是否加载
实际上也没有加载,这个是使用的时候加载,所以方法里的日志不会直接打出来。

Application的package及子package的类会自动加载,否则不会加载。调整下未加载类到Application的package及子package即可。

另外一种思路:

Application放到高层级的目录,例如直接放到com目录下

2、xxl-job报错 xxl-job registry fail, registryParam:RegistryParam{registryGroup=‘EXECUTOR’, registryKey=‘xxl-job-invoice-api’, registryValue=‘http://xx:9990/’}, registryResult:ReturnT [code=500, msg=The access token is wrong., content=null]

注册报错,一般是配置问题。例如这里就是accessToken错了。当然其他情况也可能是ip地址错了,看具体报错吧

3、xxl-job-admin的Web界面账号密码在哪设置

默认是在代码里面写死了,可以在JobInfoControllerTest 中的login方法中修改

public class JobInfoControllerTest extends AbstractSpringMvcTest {
  private static Logger logger = LoggerFactory.getLogger(JobInfoControllerTest.class);

  private Cookie cookie;

  @BeforeEach
  public void login() throws Exception {
    MvcResult ret = mockMvc.perform(
        post("/login")
            .contentType(MediaType.APPLICATION_FORM_URLENCODED)
            .param("userName", "admin")
            .param("password", "123456")
    ).andReturn();
    cookie = ret.getResponse().getCookie(LoginService.LOGIN_IDENTITY_KEY);
  }
}
SpringBoot可以很方便地与XXL-JOB进行整合实现任务调度和定时任务的功能。你可以仿照com.xxl.job.executor.service.jobhandler.SampleXxlJob类的实现,在你的Spring Boot项目中定义一个类,并使用@XxlJob注解来标记你的任务处理方法。在这个方法中,你可以编写你的任务逻辑代码。同时,你可以通过XxlJobHelper.log方法打印执行日志,并通过XxlJobHelper.handleFail和XxlJobHelper.handleSuccess方法来自主设置任务结果。 为了使用XXL-JOB,你需要启动xl-job-admin服务。首先,你需要创建数据库并执行相应的SQL文件。然后,修改yml配置文件,配置好数据库连接等信息。最后,启动xl-job-admin服务,通过访问http://127.0.0.1:8080/xxl-job-admin/并使用admin/123456登录,如果能看到相应的界面则说明配置成功。接着,你可以根据xxl-job-executor-sample-springboot项目模仿,创建一个自己的Spring Boot服务进行开发。 整合完成后,你的Spring Boot项目就可以使用XXL-JOB进行任务调度和定时任务的管理了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot整合XXL-JOB项目,以及附带使用xxl-job邮件定时发送。](https://download.csdn.net/download/qq_42217363/86402558)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [springboot整合xxl-job](https://blog.csdn.net/qq_32419139/article/details/131187884)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值