目前,我有一个基于 Java 7、tomcat 7 和 Spring 4 的 Web 应用程序,它在 tomcat 启动时调用一个线程。 该线程始终处于 Activity 状态,java 代码为:
public class Scheduler {
Queue<Long> queue = new ArrayBlockingQueue<Long>();
private static class ThreadExecutor implements Runnable
{
.......
@Override
public void run()
{
while(true)
{
Long ID = queue.get();
if(ID != null)
{
Object o = webFacade.get(ID);
//Exec....
}
else
{
try
{
Thread.sleep(30000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
}
外部事件用对象的 ID 填充队列。 对于一个 tomcat,这个线程运行良好,但现在我需要添加另一个 tomcat,所以我想在集群模式下引入 Quartz。 我在我的项目中配置了 Quartz,它似乎可以工作,但现在我如何使用 Quartz“翻译”这个类?我希望只有一个线程处于 Activity 状态,因为它对我的数据库来说非常昂贵。
提前致谢
最佳答案
一般来说,在集群模式下运行的 Quartz 保证作业只会在一台服务器上触发(和处理)。
因此 Job 将是您执行的任务(换句话说,应该执行什么)。
现在 Quartz 还引入了 Trigger 的概念,它基本上定义了作业将被触发的时间。
根据您的代码片段,您每 30000 毫秒 = 30 秒运行一次作业。因此,您将每 30 秒触发一次您的东西(SimpleTrigger 将完成这项工作)。
因此,'while' 循环消失了,它将由 quartz 自动处理。 在工作中,您只会使用队列。不清楚谁填满了这个队列,但这看起来像是一个不同的问题。
很难准确地说出你是如何翻译队列的,但一般来说工作应该
- 从队列中获取
- 像现在一样调用 webFacade
就是这样。最后但并非最不重要的是,Spring 与 Quartz 完美集成。参见 Chapter 33.6 .
关于java - quartz ,调度过程始终存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37297327/