quartz在job间隔期间内,保证上一个任务执行完后,再去调度下一个任务(转),在多线程。。。

更新时间:2023-05-05 09:54:51 阅读: 评论:0

quartz在job间隔期间内,保证上⼀个任务执⾏完后,再去调度下⼀个任务(转),在多线程。。。
Quartz定时任务默认都是并发执⾏的,不会等待上⼀次任务执⾏完毕,只要间隔时间到就会执⾏,这样往往会导致我们执⾏的数据不正确。如果定时任执⾏太长,会长时间占⽤资源,导致其它任务堵塞。
解决办法:
1.在Spring中这时需要设置concurrent的值为fal, 禁⽌并发执⾏。
<property name="concurrent" value="true" />
2.当不使⽤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),建议和我⼀样把多线程的部分提到前⾯启动哪⼀个部分。这样就可以具备多线程⼜可以使得注释有效。

本文发布于:2023-05-05 09:54:51,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/96536.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:任务   结果   需要   注解   并发
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图