2012-03-19 93 views
3

我有两个工作,认为他们是超级简单的工作,只是打印一行,没有触发器或超时定义。当我通过控制器类呼叫他们时,他们工作得很好:<name of my class>Job.triggerNow()如何在另一个完成时触发作业?

我想要的是触发一项工作,并随着工作完成而触发一项随之而来的不同工作。

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

我知道我可以触发第二个作业的最后一行对我的第一份工作的执行方法,但是这是不可取的,因为它在技术上并不比我想的第一份工作和夫妻的事情的一部分。

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

+0

对不起忘了提及这是在grails中使用石英(所以即时通讯使用groovy而不是java) – 2012-03-19 19:28:29

回答

2

它听起来像什么,你追求的是工作的一个异步“管道”里也有不同的工人说都是在一条线上,并通过将数据从一个工作到下一个。这种架构是惊人灵活,适用于一些非常普遍的应用

,我发现得到的地方这样的架构,Grails的,最好的办法是使用消息队列,像RabbitMQ例如,通过一系列队列(管道中的每一步都有一个队列),然后让控制器将消息放入管道的第一步。

然后,如果您有一名工作人员(如果您使用优秀的RabbitMQ Grails plugin,那么只需在Grails应用程序中提供一项服务)就可以监听保存作业的队列。随着工作进入队列,工作人员将关闭作业,处理作业,然后将消息放入管道中下一步的队列中。

我发现这是建筑师几乎任何异步流水线的最好方式,因为它允许根据需要您单独缩放每个片,没有太多的开销。有方式也从不必了解在管道中的下一个步骤的分离工作,但我发现,在大多数情况下,这是不是真的需要,只是徒然增加了复杂性。

石英非常适合那些需要按计划发生的工作,但管道是在处理事情变得更好,因为它有一个可扩展的方式

+0

感谢您的建议。为了澄清,我是否仍然可以在后台使用石英作业并通过服务或控制器通过RabbitMQ连接它们,还是应该将我的“作业”移动到常规的java/groovy类或服务中,然后从那里进行操作? – 2012-03-19 22:32:47

+0

对于需要在日程安排_上发生的任何任务,请使用我们的石英工作。对于任何应该更像是让工作人员观察一系列作业并在它们进入时处理它们的任务,使用RabbitMQ插件在执行工作的队列上创建监听器(这只是一个grails服务)。不同之处在于石英工作是周期性的,RabbitMQ工作尽可能快地处理工作。 – cdeszaq 2012-03-20 12:31:05

0

请看看@ JobListener

你可以利用

public void jobWasExecuted(JobExecutionContext context, 
      JobExecutionException jobException); 
0

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

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

相关问题