Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。
在Spring中这时需要设置concurrent的值为false, 禁止并发执行。
<property name="concurrent" value="true" />
当不使用spring的时候就需要在Job的实现类上加@DisallowConcurrentExecution的注释
@DisallowConcurrentExecution 禁止并发执行多个相同定义的JobDetail, 这个注解是加在Job类上的, 但意思并不是不能同时执行多个Job, 而是不能并发执行同一个Job Definition(由JobDetail定义), 但是可以同时执行多个不同的JobDetail, 举例说明,我们有一个Job类,叫做SayHelloJob, 并在这个Job上加了这个注解, 然后在这个Job上定义了很多个JobDetail, 如sayHelloToJoeJobDetail, sayHelloToMikeJobDetail, 那么当scheduler启动时, 不会并发执行多个sayHelloToJoeJobDetail或者sayHelloToMikeJobDetail, 但可以同时执行sayHelloToJoeJobDetail跟sayHelloToMikeJobDetail
-
@PersistJobDataAfterExecution 同样, 也是加在Job上,表示当正常执行完Job后, JobDataMap中的数据应该被改动, 以被下一次调用时用。当使用@PersistJobDataAfterExecution 注解时, 为了避免并发时, 存储数据造成混乱, 强烈建议把
-
@DisallowConcurrentExecution注解也加上。
@DisallowConcurrentExecution
-
此标记用在实现Job的类上面,意思是不允许并发执行,按照我之前的理解是 不允许调度框架在同一时刻调用Job类,后来经过测试发现并不是这样,而是Job(任务)的执行时间[比如需要10秒]大于任务的时间间隔[Interval(5秒)],那么默认情况下,调度框架为了能让 任务按照我们预定的时间间隔执行,会马上启用新的线程执行任务。否则的话会等待任务执行完毕以后 再重新执行!(这样会导致任务的执行不是按照我们预先定义的时间间隔执行)
-
测试代码,这是官方提供的例子。设定的时间间隔为3秒,但job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行,否则会在3秒时再启用新的线程执行
Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。在Spring中这时需要设置concurrent的值为false, 禁止并发执行。 &lt;property name="concurrent" value="true" /&gt;当不使用spring的时候就需要在Job的实现类上加...
本次遇到这个问题是这样一个场景,某些计算需要较长的时间,并且监控的周期会比较短。每3S监控一次,且执行周期最长已经达到5S,由于定时任务执行逻辑下一次依赖上一次的结果,因此如果并发的情况下,会导致计算错误。
在开发单个节点的时候,没有问题,当部署了多个执行阶段的时候,任务被并发的执行了。
好了,现在的问题是。
Dis
allowCon
current
Execution
没有做到真正的多机非并发执行!
解决方案是,增加分布式锁。为了不增加架构复杂度,直接引入了re
dis
son红锁来进行处理。增加了BaseQuart
这两个
注解
是用在哪里的?
1,
注解
@
Dis
allowCon
current
Execution
和@PersistJobDataAfter
Execution
都是用在org.quartz.Job的实现类上的。
2,都是针对JobDetail实例的,而不是Job实现类的。
注解
说明:
@PersistJobDataAfter
Execution
:告诉Quartz在成功执行了Job实现类的execute方法后(没有发生任何异常),更新JobDetail中JobDataMap的数据,使得该JobDetail实例在下一
Quartz定时任务默认是并发执行的,不会等待上一次任务执行完毕再执行下一个任务,也就是说当到达间隔时间就会执行对应的任务。
如果定时任执行太长,会长时间占用着资源,同时会出现多个线程并存的情况,导致其它任务堵塞。
如何解决呢? 可以在JOB的实现类上添加@
Dis
allowCon
current
Execution
注解
,禁止同一个JobDetail并发执行。
@
Dis
allowCon
current
Execution
禁止并发执行多个相同定义的JobDetail, 这个
注解
是加在Job类上的, 但意思并不是不能同时执行多个Job, 而是不能并发执行同一个Job Definition(由JobDetail定义), 但是可以同时执行多个不同的JobDetail。
即对于同一个Job任务不允许并发执行,但对于不同的job任务不受影响。
@PersistJ...
Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。
在Spring中这时需要设置con
current
的值为false, 禁止并发执行。
<property name="con
current
" value="true" />
当不使用spring的时候就需要在Job的实现类上加@
Dis
allowCon
current
Execution
的
注
释
@
Dis
allowCon
current
Execu.
在Spring Boot定时任务spring-boot-starter-quartz配置运行及测试这篇文章中我们简单介绍了Spring Boot中如何实现定时任务,但是有个问题,当任务的执行时长超过定时任务触发的间隔时,就会导致两个或多个任务并发在执行,如果我们不希望定时任务并发执行可以通过@
Dis
allowCon
current
Execution
注解
来禁止并发。
下面通过简单的代码来演示定时任务并发和串行的情况,关于定时任务的配置先看这篇文章Spring Boot定时任务spring-boot-start
Your job class needs to implement StatefulJob,
or alternatively, if you are using Quartz 2.x, be annotated with @
Dis
allowCon
current
Execution
.
This is how con
current
execution
can be controlled in
Exception in thread "DefaultQuartzScheduler_QuartzSchedulerThread" java.lang.NoClassDefFoundError: org/quartz/
Dis
allowCon
current
Execution
INFO: Illegal access: this web application instance has been s
@Constraint
注解
是用于自定义Bean验证
注解
的
注解
。通过使用@Constraint
注解
,可以将自定义的验证
注解
与javax.validation.ConstraintValidator接口实现类进行关联,实现对自定义
注解
的验证逻辑。
例如,假设需要自定义一个验证
注解
@MyConstraint,用于验证某个属性是否为指定的字符串,可以使用以下步骤:
1. 定义@MyConstraint
注解
,声明validatedBy属性指向实现javax.validation.ConstraintValidator接口的类。
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
String message() default "must be a specific string";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
2. 实现javax.validation.ConstraintValidator接口的类MyConstraintValidator,实现对@MyConstraint
注解
的验证逻辑。
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 验证逻辑
return "specific string".equals(value);
之后,就可以在Bean的属性上使用@MyConstraint
注解
进行验证了。例如:
public class MyBean {
@MyConstraint
private String myProperty;
// getter 和 setter
这样,在使用Bean Validation框架进行验证时,会自动调用MyConstraintValidator的isValid()方法进行验证。