运行 石英作业同步

Run Quartz job synchronous

我有一个情况不知道该如何处理。

我在 quartz 有一份工作,它应该启动另一个嵌套作业并获取嵌套作业的一些结果并处理它们。

据我所知,quartz 运行 它的工作是异步进行的。因此,启动嵌套作业的线程不能等到嵌套作业的结果被传递。

这里的解决方案是什么?

几种方法。您可以制作一些 Static/Singleton 类型 class 来保存某种 semaphore/session 变量。在检查此信号量时让主作业循环(为线程安全而同步)。然后以类似的方式检索数据。

您也可以以类似的方式使用 JobDataMap。 JobDataMap example

首先,quartz 有一个线程池用于 运行 其作业。 你可以阅读它 here:

此外请记住,石英甚至可以 运行 以分布式方式工作。它允许 运行 在 'active-active' 服务器集群中,在这种情况下,您不能对可以触发作业的服务器做任何假设。所以像 jbh 所说的那样实现一个单例可能很棘手(至少你现在已经被警告过:))

总的来说,我认为 quartz 应该发挥它的作用 - 运行 工作。 我不认为在此之上实现任何复杂的逻辑是个好主意。 根据你的问题,我了解到你正在尝试 运行 一份工作从另一份工作(比如工作 A 运行 工作 B)。如果您将不同的触发器分配给 A 和 B,这是有意义的(否则为什么 B 应该实现为石英作业?)。所以也许你可以重构你的作业 B 的代码,以便在 B 中执行的逻辑将在一些与石英无关的 class 中实现(比如 class C)?在这种情况下,您可以为作业 A 和 B 分配不同的触发器,但在内部只需执行 class C?

中的代码

示例(您的方法):

class A implements Job {
  public void execute(JobExecutionContext context) throws JobExecutionException {
      // do A's stuff
      // call Job B somehow (???)
  }
}


class B implements Job {
  public void execute(JobExecutionContext context) throws JobExecutionException {
      // do something
  }

}

我的建议:

class C {
   doSomeLogic(...) {...}
}


class A implements Job {
         public void execute(JobExecutionContext context) throws   JobExecutionException {
        // do A's stuff
        C c = new C();
        c.execute();  
  }


class B implements Job {
         public void execute(JobExecutionContext context) throws JobExecutionException {            
        C c = new C();
        c.execute();  
  }

}

希望对您有所帮助。