Quartz高可用定时任务快速上手

这篇博客介绍了如何利用Quartz框架创建高可用的定时任务。内容包括引入依赖、快速上手、手动触发任务、带参数任务、任务并发控制以及任务持久化。通过设置注解和配置文件,可以实现任务的调度、手动触发、参数注入和防止并发执行。同时,通过数据库持久化确保任务在多节点部署下的正常运行。提供了相关配置示例和接口调用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定时任务使用指南

如果你想做定时任务,有高可用方面的需求,或者仅仅想入门快,上手简单,那么选用它准没错。

定时任务模块是对Quartz框架进一步封装,使用更加简洁。

1、引入依赖
<dependency>
    <groupId>xin.altitude.cms</groupId>
    <artifactId>ucode-cms-quartz</artifactId>
    <version>1.5.4.1</version>
</dependency>
2、快速上手

实现org.quartz.Job接口;使用注解CronExp添加任务的调度策略;使用注解Component将任务注入容器中。

启动项目,定时任务便处于监听与运行中。

@Component
@DisallowConcurrentExecution
@CronExp(cron = "0/5 * * * * ?")
public class DemoJob implements Job {
    @Override
    public void execute(JobExecutionContext context) {
        System.out.println("任务1:" + LocalDateTime.now());
    }
}

3、手动触发定时任务

定时任务除了以既有频率周期性运行外,还有通过接口手动被触发的能力。

调用如下接口,可手动触发任务ID编号为jobId的任务。

http://localhost:8080/cms-api/quartz/job/{jobId}

如果有手动触发定时任务的需求,则需要任务ID唯一并已知,因此需要在编写定时任务时手动指定。

@CronExp(id = 1, cron = "0/5 * * * * ?")

通过注解CronExp的id属性可指定任务ID,不显示指定则使用随机ID,不满足已知的条件,因此无法手动触发。

4、带参数任务

尽管大多数任务不需要注入参数,但仍有少量的场景需要向定时任务注入参数。

public void execute(JobExecutionContext context) {
    /* 如果在调用任务时传入了参数,则能够从Map中获取 */
    Map<String, Object> dataMap = context.getMergedJobDataMap();
    /* 比如从Map中获取一个键值对,一般来说参数均为基本数据类型 */
    Object key = dataMap.get("key");
    System.out.println("任务2:" + LocalDateTime.now() + ": " + key);
}

在编写定时任务时,可从JobExecutionContext对象中解析一个Map,从而完成参数的注入。

http://localhost:8080/cms-api/quartz/job/1?key=a

上述http调用的含义是手动触发任务ID为【1】的任务,并且向其传递参数为【key】值为【a】的参数。

5、任务并发

本框架不支持任务并发,换句话说并发对定时任务不利,因此需要手动禁止。

需要注意的是Quartz的并发是指当任务执行耗时超过任务调度周期时,上一个任务未执行完,新任务是否执行。

一般来说需要显示禁止并发,在任务类上添加注解DisallowConcurrentExecution即可禁止任务并发。

6、持久化

如果定时任务有高可用的需求,那么需要对任务进行持久化。定时任务数据持久化到数据库中后,支持应用程序多开。定时任务持久化多节点部署后,集群中单节点故障不影响定时任务的执行。

定时任务持久化,仅需修改yml文件配置即可达到目标,无需修改代码。一般而言使用Mysql做持久化的容器。

spring:
  quartz:
    properties:
      org.quartz.jobStore.isClustered: true
      org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
      org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
      org.quartz.jobStore.dataSource: qzDS
      org.quartz.dataSource.qzDS.driver: com.mysql.cj.jdbc.Driver
      org.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost:3306/quartz-demo
      org.quartz.dataSource.qzDS.user: root
      org.quartz.dataSource.qzDS.password: 123456

除了修改主机、端口、数据库名、用户名、密码五个参数外,其余参数使用默认值即可。

配置完数据库连接后,使用SQL脚本,注意初始化数据库


如有疑问,可通过微信dream4s与作者联系。源码在GitHub,视频讲解在B站,本文收藏在博客天地


### 配置并使用火山引擎 DeepSeek R1 API 为了在聊天框中正确配置使用火山引擎 DeepSeek R1 API,需遵循特定流程来确保集成顺利。 #### 获取 API 密钥 如果已经获取了 DeepSeek 的 API,则从打开的界面中选择 DeepSeek API,直接填充 API 密钥,然后点击保存[^1]。这步骤对于后续调用至关重要,因为每次请求都需要验证此密钥的有效性。 #### 设置开发环境 确保本地或服务器端已安装 Python 或其他支持 HTTP 请求的语言环境。Python 是常用的编程语言之,下面将以 Python 为例展示如何发起 API 调用: ```python import requests import json api_key = 'your_api_key_here' url = "https://api.deepseek.com/v1/chat" headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {api_key}' } data = { "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "What is the weather like today?"}, {"role": "assistant", "content": ""} ] } response = requests.post(url, headers=headers, data=json.dumps(data)) print(response.json()) ``` 这段代码展示了向 DeepSeek 发起 POST 请求的方法,其中包含了必要的头部信息以及消息体结构。`messages` 字段用于传递对话历史记录,使得模型能够基于上下文做出回应。 #### 处理不稳定因素 考虑到当前 DeepSeek API 存在不稳定性的问题,建议开发者密切关注官方文档更新,并考虑设置重试机制以应对可能发生的网络错误或其他异常情况。此外,在实际应用中可以探索通过第三方服务如硅基流动 API 进行间接对接作为备用方案[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值