我有一种情况,我不知道应该如何处理它。
我在quartz
有一份工作,应该启动另一个嵌套作业并获得嵌套作业的一些结果并处理它们。
据我所知,quartz
异步运行它的工作。因此,启动嵌套作业的线程不能等到嵌套作业的结果传递完毕。
这里有什么解决方案?
答案 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