运行Quartz作业同步

时间:2015-11-03 06:39:55

标签: java quartz-scheduler

我有一种情况,我不知道应该如何处理它。

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

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

这里有什么解决方案?

2 个答案:

答案 0 :(得分:1)

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

另外请记住,石英甚至可以以分布式方式运行作业。它允许在“主动 - 主动”群集中运行。在这种情况下,您无法对可以触发作业的服务器做任何假设。所以实现一个单身作为jbh说明可能很棘手(至少你现在已经被警告了:))

总的来说,我认为石英应该尽其所能 - 做好工作。 我不认为在此基础上实施任何复杂的逻辑是个好主意。 根据您的问题,我了解您正在尝试从另一个工作中完成一项工作(比如工作A运行工作B)。如果你有不同的触发器分配给A和B,这是有道理的(否则为什么B应该实现为石英作业?)。那么也许你可以重构你的作业B代码,这样在B中执行的逻辑将在一些与石英无关的类中实现(比如C类)?在这种情况下,您可以为作业A和B分配不同的触发器,但只是在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();  
  }

}

希望这有帮助。

答案 1 :(得分:0)

几乎没有办法。您可以创建一些包含某种信号量/会话变量的Static / Singleton类型类。在检查此信号量时进行主作业循环(为线程安全同步)。然后类似地检索数据。

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