怎么用quartz控制任务的执行顺序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用quartz控制任务的执行顺序相关的知识,希望对你有一定的参考价值。
我是用的C#,相信JAVA中也存在类似的功能:
1、设置需要在上一个job执行完成后继续执行的job的 StoreDurably(true)
var job2 = JobBuilder.Create<TestJob>().WithIdentity(jobKey2)
.StoreDurably(true).Build();
var job3 = JobBuilder.Create<TestJob>().WithIdentity(jobKey3)
.StoreDurably(true).Build();
2、添加job链监听:JobChainingJobListener
chain.AddJobChainLink(jobKey1, jobKey2);
chain.AddJobChainLink(jobKey2, jobKey3);
scheduler.ListenerManager.AddJobListener(chain, GroupMatcher<JobKey>.AnyGroup());
3、将job添加到 scheduler
scheduler.AddJob(job2, true);
scheduler.AddJob(job3, true);
4、这样做的缺点:
尽管配置了相同jobKey串行执行,如果并发的触发任务链的下一次执行job1,将只会等待job1执行完成后(而不是整个任务链执行完毕)。也就是job1和job2、job3将会并发执行。有并发需求的同学请参考楼上的答案:把需要并行的任务塞到一个任务队列里面。
参考技术A 把需要并行的任务塞到一个任务队列里面,用一个线程去执行,比如下面的代码:Java代码
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
public class OrderedJobService
private BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(10);
private boolean running = false;
public void start()
running = true;
Thread t = new Thread(new OrderedJob());
t.start();
public void stop()
running = false;
public void submit(Runnable job)
try
if (queue.offer(job, 5000L, TimeUnit.MILLISECONDS) == false)
// 处理插入失败...
catch (InterruptedException e)
e.printStackTrace();
class OrderedJob implements Runnable
@Override
public void run()
while (running)
try
Runnable job = queue.poll(5000L, TimeUnit.MILLISECONDS);
try
if (job != null)
job.run();
catch (RuntimeException e)
// TODO: handle exception
catch (InterruptedException e)
e.printStackTrace();
本回答被提问者和网友采纳
org.quartz.scheduler对过时任务是怎么处理,配置文件scheduler.properties中
org.quartz.jobStore.misfireThreshold: 4000,需要详细,越深入越好!
参考技术A 问的是java quartz的配置吧在并发任务下,每个任务启用一个线程,如果线程池中的线程已经用完,再来任务时需要等待,直到有线程可用。如果等待时间过长,超过了org.quartz.jobStore.misfireThreshold设置的时间,本次任务不再执行。直到有任务执行完空出线程池,以此时间为基准开始下次任务执行。
misfireThreshold只有当job任务被阻塞时才有效,如果线程池里线程很多,该参数没有意义,所以大部分时候只对有状态的job才有意义。
参考:http://www.cnblogs.com/abinxm/archive/2011/09/29/2195944.html
以上是关于怎么用quartz控制任务的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章
Android Gradle 插件自定义 Gradle 任务 ⑨ ( 控制 Gradle 执行任务顺序 | Task#finalizedBy 函数 | 控制 Gradle 执行任务顺序示例分析 )
Android Gradle 插件自定义 Gradle 任务 ⑨ ( 控制 Gradle 执行任务顺序 | Task#finalizedBy 函数 | 控制 Gradle 执行任务顺序示例分析 )