예약된 작업을 수행하고 싶거나, 고가용성
요구 사항이 있거나, 빠르게 시작
하고 쉽게 시작하고 싶다면, 그것을 선택하는 것이 옳습니다. 高可用
方面的需求,或者仅仅想入门快
,上手简单,那么选用它准没错。
定时任务模块是对Quartz框架进一步封装,使用更加简洁。
<dependency> <groupId>xin.altitude.cms</groupId> <artifactId>ucode-cms-quartz</artifactId> <version>1.5.4.1</version> </dependency>
实现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()); } }
定时任务除了以既有频率周期性运行外,还有通过接口手动被触发的能力。
调用如下接口,可手动触发任务ID编号为jobId
的任务。
http://localhost:8080/cms-api/quartz/job/{jobId}
如果有手动触发定时任务的需求,则需要任务ID唯一并
且已知
,因此需要在编写定时任务时手动指定。
@CronExp(id = 1, cron = "0/5 * * * * ?")
通过注解CronExp
的id属性可指定任务ID,不显示指定则使用随机ID,不满足已知的条件,因此无法手动触发。
尽管大多数任务不需要注入参数,但仍有少量的场景需要向定时任务注入参数。
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】的参数。
本框架不支持任务并发,换句话说并发对定时任务不利,因此需要手动禁止。
需要注意的是Quartz
的并发是指当任务执行耗时超过任务调度周期时,上一个任务未执行完,新任务是否执行。
一般来说需要显示禁止并发,在任务类上添加注解DisallowConcurrentExecution
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
org.quartz.Job
인터페이스를 구현하고 CronExp
주석을 사용하여 작업 예약 전략을 추가하세요. Component
주석을 사용하면 컨테이너에 작업이 주입됩니다. 프로젝트를 시작하면 예정된 작업이 모니터링되고 실행됩니다. rrreee기존 빈도로 주기적으로 실행하는 것 외에도 예약된 작업에는 인터페이스를 통해 수동으로 트리거할 수도 있습니다. 🎜🎜작업 ID 번호가3. 예약된 작업을 수동으로 트리거
jobId
인 작업을 수동으로 트리거하려면 다음 인터페이스를 호출하세요. 🎜🎜http://localhost:8080/cms-api/quartz/job/{jobId}
🎜🎜예약된 작업을 수동으로 트리거해야 하는 경우 작업 ID는 고유하고
코드> 및 알려진
이므로 예약된 작업을 작성할 때 수동으로 지정해야 합니다. 🎜rrreee🎜CronExp
의 id 속성에 주석을 달아 작업 ID를 지정할 수 있습니다. 명시적으로 지정하지 않으면 알려진 조건을 충족하지 않으므로 임의의 ID가 사용됩니다. 수동으로 트리거됩니다. 🎜🎜4. 매개변수가 있는 작업🎜🎜대부분의 작업에서는 매개변수를 주입할 필요가 없지만 예약된 작업에 매개변수를 주입해야 하는 소수의 시나리오가 있습니다. 🎜rrreee🎜예약된 작업을 작성할 때 JobExecutionContext
개체에서 맵을 구문 분석하여 매개변수 주입을 완료할 수 있습니다. 🎜rrreee🎜위 http 호출의 의미는 작업 ID가 [1]인 작업을 수동으로 트리거하고 값이 [a]인 [key] 매개변수를 전달한다는 것입니다. 🎜🎜5. 작업 동시성🎜🎜이 프레임워크는 작업 동시성을 지원하지 않습니다. 즉, 동시성은 예약된 작업에 적합하지 않으므로 수동으로 비활성화해야 합니다. 🎜🎜Quartz
의 동시성은 작업 실행 시간이 작업 스케줄링 주기를 초과하고 이전 작업이 실행되지 않은 경우 새 작업을 실행할지 여부를 나타냅니다. 🎜🎜일반적으로 작업 동시성을 비활성화하려면 작업 클래스에 DisallowConcurrentExecution
주석을 추가해야 합니다. 🎜🎜6. 지속성🎜🎜예약된 작업에 고가용성 요구 사항이 있는 경우 해당 작업은 지속되어야 합니다. 예약된 작업 데이터가 데이터베이스에 유지되면 여러 응용 프로그램을 열 수 있습니다. 예약된 작업의 지속적인 다중 노드 배포 후에는 클러스터의 단일 노드 오류가 예약된 작업의 실행에 영향을 미치지 않습니다. 🎜🎜시간 제한 작업 지속성, 코드 수정 없이 목표를 달성하려면 yml 파일 구성만 수정하면 됩니다. 일반적으로 MySQL은 영구 컨테이너로 사용됩니다. 🎜rrreee🎜호스트, 포트, 데이터베이스 이름, 사용자 이름, 비밀번호의 5가지 매개 변수를 수정하는 것을 제외하고 나머지 매개 변수는 기본값을 사용합니다. 🎜🎜🎜데이터베이스 연결을 구성한 후 SQL 스크립트를 사용하여 데이터베이스 초기화에 주의하세요🎜🎜위 내용은 Quartz를 사용하여 Java 고가용성 예약 작업을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!