怎么用quartz控制任务的执行顺序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用quartz控制任务的执行顺序相关的知识,希望对你有一定的参考价值。

我是用的C#,相信JAVA中也存在类似的功能:

1、设置需要在上一个job执行完成后继续执行的job的 StoreDurably(true)

var job1 = JobBuilder.Create<TestJob>().WithIdentity(jobKey1).Build();
var job2 = JobBuilder.Create<TestJob>().WithIdentity(jobKey2)
    .StoreDurably(true).Build();
var job3 = JobBuilder.Create<TestJob>().WithIdentity(jobKey3)
    .StoreDurably(true).Build();

2、添加job链监听:JobChainingJobListener

JobChainingJobListener chain = new JobChainingJobListener("testChain");
 chain.AddJobChainLink(jobKey1, jobKey2);
 chain.AddJobChainLink(jobKey2, jobKey3);
scheduler.ListenerManager.AddJobListener(chain, GroupMatcher<JobKey>.AnyGroup());

3、将job添加到 scheduler

scheduler.ScheduleJob(job1, trigger1);
 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控制任务的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

quartz求助:每天定点执行一次,该怎么做?

如何在quartz中手动控制任务

quartz 怎么立即执行

使用 ExecutorService 控制任务执行顺序

Android Gradle 插件自定义 Gradle 任务 ⑨ ( 控制 Gradle 执行任务顺序 | Task#finalizedBy 函数 | 控制 Gradle 执行任务顺序示例分析 )

Android Gradle 插件自定义 Gradle 任务 ⑨ ( 控制 Gradle 执行任务顺序 | Task#finalizedBy 函数 | 控制 Gradle 执行任务顺序示例分析 )