我正在使用Quartz进行项目开发,其中与任务相关的依赖存在问题。
我们有一个设置,在该设置下A和B彼此不依赖,但C有依赖关系:
A和B可以同时运行,但只有在A和B都完成后,C才能运行。
是否有一种方法在Quartz中设置这种场景,以便仅当A和B完成时,C才会触发?
我正在使用Quartz进行项目开发,其中与任务相关的依赖存在问题。
我们有一个设置,在该设置下A和B彼此不依赖,但C有依赖关系:
A和B可以同时运行,但只有在A和B都完成后,C才能运行。
是否有一种方法在Quartz中设置这种场景,以便仅当A和B完成时,C才会触发?
目前没有“直接”或“免费”的方法来链接Quartz中的触发器。但是,您可以通过以下几种方式轻松实现此目标。下面概述了几种方法:
一种方法是使用监听器(即TriggerListener、JobListener或SchedulerListener),它可以注意到作业/触发器的完成,并立即安排新的触发器来触发。这种方法可能有些复杂,因为您必须通知监听器哪个作业跟随哪个作业,并且您可能需要担心此信息的持久性。请参见随Quartz一起提供的监听器org.quartz.listeners.JobChainingJobListener,因为它已经具有某些功能。
另一种方法是构建一个作业,其中包含下一个作业要触发的名称(名称存储在其JobDataMap中),并且当作业完成(在其execute()方法的最后一步)时,使作业安排下一个作业。许多人都这样做,并且取得了良好的效果。大多数人都创建了一个基本(抽象)类,它是一个作业,知道如何使用预定义键(常量)从JobDataMap中获取作业名称和组,并包含调度已识别的作业的代码。此抽象作业的execute()实现委托给抽象模板方法,例如“doWork()”(其中扩展作业类的实际工作将进行),然后它包含用于安排后续作业的代码。然后,他们只需创建包括作业应执行的工作的此类的扩展即可。使用“持久性”作业或重载的addJob(JobDetail、boolean、boolean)方法(在Quartz 2.2中添加)有助于应用程序一次定义所有作业及其正确的数据,而不会创建触发器来触发它们(除了一个触发器来触发链中的第一个作业)。
在未来,Quartz将提供更清晰的方法来实现此操作,但在此之前,您必须使用上述方法之一或考虑另一种更适合您的方法。