【问题标题】:How do I trigger a job when another completes?当另一个工作完成时,我如何触发工作?
【发布时间】:2012-03-19 19:25:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 抱歉忘了提到这是在 grails 中使用石英(所以我使用的是 groovy 而不是 java)

标签: grails groovy quartz-scheduler


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的建议。所以只是为了澄清一下,我是否仍然可以在后台使用石英作业并通过服务或控制器通过 RabbitMQ 连接它们,还是应该将我的“作业”移动到常规的 java/groovy 类或服务中并从那里开始?
  • 对于任何需要按计划进行的任务,我们的石英作业。对于任何表现得更像是让工作人员监视作业队列并在它们进入时对其进行处理的任何任务,请使用 RabbitMQ 插件在执行工作的队列上创建侦听器(这只是一个 grails 服务)。不同之处在于石英作业是周期性的,而 RabbitMQ 作业正在尽可能快地处理作业。
【解决方案2】:

请看@ JobListener

你可以使用

public void jobWasExecuted(JobExecutionContext context,
            JobExecutionException jobException);

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多