by:垃圾程序员

零、前言

因为有这样一个业务需求,系统要可以录入任务计划,并在未来的某个时间节点进行触发,来修改某一设备的状态,且只执行一次。

所以准备用xxl-job结合java语言来实现,网上找到一个比较不错的轮子,感谢同志!

https://github.com/aitxiaogang/xxl-job-admin-sdk-boot-startericon-default.png?t=N6B9https://github.com/aitxiaogang/xxl-job-admin-sdk-boot-starter

一、安装xxl-job

在此就不做集群了,直接单体跑

1.1下载源码

通过gitee把源码下载下来,现在最新版是2.4.1了。

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

 1.2配置参数

打开源码,你想要了解的、探索的、依赖的都在这个doc目录下。在此不做赘述了。

这里我们主要是做修改两项配置:数据库的连接地址、通讯TOKEN。其他的配置全部默认,你可以按需修改。

打开xxl-job-admin的配置文件,数据库修改为你自己的数据源信息,至于TOKEN则是用于接口鉴权和身份验证的凭证。建议你修改一下,不要用默认的。

1.3进入调度中心

直接启动项目,默认端口是8080,浏览器访问默认地址:http://localhost:8080/xxl-job-admin

默认账号:admin

默认密码:123456

1.4添加一个执行器

进入执行器管理,新增执行器即可。AppName比较关键,这是之后你程序连接到调度中心的一个重要标识。默认执行器的端口是9999。

至此,调度中心就算是完成了。

二、java对接xxl-job

新建一个项目或者在你现有项目上进行操作

2.1引入依赖

<dependency>
	<groupId>com.lxgnb</groupId>
	<artifactId>xxl-job-boot-starter</artifactId>
	<version>2.3.0-jobinfo-executor-2</version>
</dependency>

2.2修改配置

xxl:
  job:
    sdk:
      admin-url: http://127.0.0.1:8080/xxl-job-admin
      user-name: admin
      password: 123456
      appname: product-replace-service
      access-token: lajichengxuyuan

以下是相关的配置信息:

  • admin-url: xxl-job-admin的地址,即任务调度平台的访问URL。
  • user-name: 登录xxl-job-admin的用户名。
  • password: 登录xxl-job-admin的密码。
  • appname: 应用程序的名称,用于在任务调度平台中标识你的应用。这个和你创建的执行器的AppName要对应起来
  • access-token: 访问xxl-job接口时需要携带的token,用于鉴权和身份验证。这个要和你配置的TOKEN对应起来

2.3启动项目

启动项目后,查看是否有执行器注册上来,如果如下图则表示注册进来了。

 三、对应接口

注入关键类后就可以进行任务的CRUD操作了

@Autowired
private XxlJobService xxlJobService;

新建一个测试类,对外暴露接口,以下皆为示例,不代表最佳实践。

@RestController
@RequestMapping("/xxljob")
public class xxljob {

    @Autowired
    private XxlJobService xxlJobService;

    //添加任务并运行
    @PostMapping("/addTask")
    @ResponseBody
    public void addTask(@RequestBody Map data) {
        try {
            /**
             customId – 自定义的唯一的业务id,此id在所有任务中保持唯一,注意:这个唯一标识被放到了负责人字段
             triggerTime – 任务执行时间,必须大于当前时间
             executorParam – 任务执行参数
             executorHandler – 任务处理器,关联@XxlJob的value
             */
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Integer taskId = xxlJobService.addJustExecuteOnceJob("1",dateFormat.parse("2023-08-04 13:45:00"),"我是执行的参数","testHandler");
            //开始运行任务
            xxlJobService.start(taskId);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    //删除
    @PostMapping("/deleteTask")
    @ResponseBody
    public void deleteTask(@RequestBody Map data) {
        try {
            //通过自定义的唯一的业务id获取任务的id
            Integer taskId = xxlJobService.getJobIdByCustomId("1");
            //删除任务
            xxlJobService.remove(taskId);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    //任务处理器
    @XxlJob("testHandler")
    public void test() {
        System.out.println("计划任务开始执行");
        // 获取任务参数
        String param = XxlJobHelper.getJobParam();
        System.out.println("计划任务传输过来的参数 ------" + param);
    }
}

3.1调用添加任务并运行接口

去调度中心查看任务,会发现已经出现了正在运行的任务

3.2在对应时间节点查看任务处理器是否被触发

在45分的時候,任务处理器被触发,并打印了我们之前填写的参数

在查看任務,已经停止了

3.3调用删除任务接口

接下来调用删除接口,在此之前还想着我们自定义的唯一的业务id吗,我们在创建任务时填写的是"1",所以代码中也写了"1",但是到你们的业务场景下,就需要你们自己定义了。

 再次查看任务,会发现任务已经被删除了。

至此,一个简单的业务逻辑就实现了,你可以再次基础上增加你的业务逻辑,实现文明的递进。

多想一抬头看见你微笑的脸庞

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐