当另一个工作完成时,如何触发工作?

时间:2012-03-19 19:25:51

标签: grails groovy quartz-scheduler

我有两个工作,认为它们是超级简单的工作,只打印一行,没有触发器或超时定义。当我从控制器类通过:<name of my class>Job.triggerNow()

调用它们时,它们工作正常

我想要的是触发一项工作,并在完成后触发一项相应的工作。

我已尝试使用quartzScheduler,但我似乎无法从我的工作类中获得JobDetail,所以我不确定这样做的正确方法是什么。我还希望将第一份工作的一些结果传递给第二份工作。

我知道我可以触发第二份工作作为我第一份工作执行方法的最后一行,但这是不可取的,因为它在技术上不是第一份工作的一部分而且比我想要的更多。

任何帮助将不胜感激。感谢

3 个答案:

答案 0 :(得分:2)

你所听到的是一个异步的“管道”工作,其中有不同的工作人员都在一行,并传递数据从一个到另一个工作。这种架构令人惊讶灵活,适用于大型数量的非常常见的应用程序

我发现使用Grails实现这样一个架构的最好方法是使用一个消息队列,例如RabbitMQ,带有一系列队列(一个用于管道中的每个步骤),然后让控制器将消息放入管道的第一步。

然后,你有一个工人(如果你使用优秀的RabbitMQ Grails plugin,只是Grails应用程序中的一项服务)听取保存工作的队列。当工作进入队列时,工作人员将弹出作业,处理它,然后将消息放入管道中下一步的队列中。

我发现这是构建任何异步管道的最佳方法,因为它允许您根据需要单独扩展每个部分,并且没有太多开销。还有 方法可以将作业与管道中的下一步分离,但我发现在大多数情况下,这并不是真正需要的,只会增加无用的复杂性。

Quartz非常适合需要按计划进行的工作,但是管道在处理事物方面要好得多,因为它以可扩展的方式进行处理

答案 1 :(得分:0)

请看看@ JobListener

您可以使用

public void jobWasExecuted(JobExecutionContext context,
            JobExecutionException jobException);

答案 2 :(得分:0)

我在我的Web应用程序中使用Redis的队列消息传递技术构建了类似于此的东西。我只是为所有作业定义依赖关系结构,并拥有一个主作业,其唯一目的是监视/更新其他作业的状态,并在需要时触发相关作业。

每个作业都必须使用Redis队列报告其运行状态/完成/取消。主作业弹出每个队列消息并正确处理。