grails - 如何在另一个作业完成时触发作业?

标签 grails groovy quartz-scheduler

我有两个作业,将它们视为 super 简单的作业,只打印一行并且没有触发器或超时定义。当我通过以下方式从 Controller 类调用它们时,它们工作正常:<name of my class>Job.triggerNow()

我想要的是触发一个作业,并在它完成时触发另一个不同的作业。

我试过使用 quartzScheduler , 但我似乎无法获得 JobDetail来 self 的工作类(class),所以我不确定这样做的正确方法是什么。我还想将第一份工作的一些结果传递给第二份工作。

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

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

最佳答案

听起来您所追求的是一个异步的工作“管道”,其中有不同的工作人员排成一行,并将要处理的数据从一个工作人员传递到另一个工作人员。这种架构非常灵活,适用于大量非常常见的应用程序

我发现使用 Grails 实现这种架构的最佳方法是使用消息队列,例如 RabbitMQ例如,使用一系列队列(管道中的每个步骤一个),然后让 Controller 将消息放入管道的第一步。

然后,您有一个工作人员(如果您使用优秀的 RabbitMQ Grails plugin,这只是 Grails 应用程序中的一项服务)监听为他们提供工作的队列。当工作进入队列时,工作人员将弹出作业,对其进行处理,然后将消息放入管道中下一步的队列中。

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

Quartz 非常适合需要按计划进行的工作,但管道更适合处理事物,因为它以可扩展的方式出现

关于grails - 如何在另一个作业完成时触发作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9776543/

相关文章:

grails - 如何使用@GrailsTypeChecked和@GrailsCompileStatic

Grails Controller 变量在 View 中不可见

image - Groovy 从 URL 下载图像

java - Quartz 无法删除作业,现在怎么办?

c# - Quartz 中是否有有意义的 ITrigger.ToString() 方法?

java - Spring NoClassDefFoundError 错误

grails - 将一个简单的 map 注入(inject)到 Grails Controller 中

grails - 如何与Wslite Soap API一起使用Nil

java - ehcache session 范围在 grails 中

grails - 在 Grails 中创建自定义条件 TagLib