石英,调度过程始终存在

Quartz, schedule process always alive

目前,我有一个基于 Java 7、tomcat 7 和 Spring 4 的 Web 应用程序,它在 tomcat 启动时调用一个线程。 此线程始终处于活动状态,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 "translate" 这个 class?我希望只有一个线程处于活动状态,因为它对我的数据库来说非常昂贵。

提前致谢

一般情况下,Quartz 在 运行 集群模式下保证作业将仅在一台服务器上触发(和处理)。

因此 Job 将是您执行的任务(换句话说,应该执行什么)。

现在 Quartz 还引入了触发器的概念,它基本上定义了何时 作业将被触发。

根据您的代码片段,您 运行 每 30000 毫秒 = 30 秒执行一次作业。所以你将每 30 秒触发一次你的东西(SimpleTrigger 将完成这项工作)。

所以,'while' 循环消失了,它将由 quartz 自动处理。 在工作中,您只会使用队列。不清楚谁填满了这个队列,但它看起来像是一个不同的问题。

很难说你是如​​何翻译队列的,但一般来说工作应该

  1. 从队列中获取
  2. 像现在一样调用 webFacade

就是这样。最后但同样重要的是,Spring 与 Quartz 完美集成。参见 Chapter 33.6