[英]Run Quartz job synchronous
我有一种情况,我不知道该如何处理。
我有一个quartz
工作,应该开始另一个嵌套工作,并获得嵌套工作的一些结果并进行处理。
据我所知, quartz
是异步运行的。 因此,启动嵌套作业的线程不能等到传递嵌套作业的结果。
这里有什么解决方案?
首先,石英有一个用于运行其作业的线程池。 您可以在这里阅读有关内容:
另外请记住,石英甚至可以以分布式方式运行作业。 它允许在“主动-主动”服务器群集中运行,在这种情况下,您无法假设可以触发作业的服务器。 因此,按照jbh所述实现单例可能很棘手(至少现在已经警告您了:))
总的来说,我认为石英应做其有益的工作。 我认为在此基础上实现任何复杂的逻辑都不是一个好主意。 根据您的问题,我了解到您正在尝试运行另一个作业(例如,作业A运行作业B)。 如果您为A和B分配了不同的触发器,那么这是有道理的(否则为什么B应该实现为石英作业?)。 因此,也许您可以重构作业B的代码,以便在与石英无关的某个类(例如C类)中实现在B中执行的逻辑? 在这种情况下,您可以为作业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();
}
}
希望这可以帮助。
几种方法。 您可以创建一些Static / Singleton类型的类,其中包含某种信号量/会话变量。 检查此信号量时(同步线程安全性)使主作业循环。 然后类似地检索数据。
您也可以以类似方式使用JobDataMap。 JobDataMap示例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.