运行 石英作业同步
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();
}
}
希望对您有所帮助。
我有一个情况不知道该如何处理。
我在 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();
}
}
希望对您有所帮助。