Quartz,计划进程始终处于活动状态

时间:2016-05-18 10:47:23

标签: java spring multithreading tomcat quartz-scheduler

目前,我有一个基于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();
                    }
              }
          }
      }
   }
}

外部事件使用Object的ID填充队列。 使用一个tomcat这个线程运行良好,但现在我需要添加另一个tomcat,所以我想在集群模式下引入Quartz。 我已经在我的项目中配置了Quartz,它似乎可以工作,但现在我怎么能翻译&#34;这个类使用Quartz?我希望只有一个线程是活动的,因为它对我的数据库来说非常昂贵。

提前致谢

1 个答案:

答案 0 :(得分:0)

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

因此Job将成为您执行的任务(换句话说,应该执行

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

在您的代码段中,每隔30000毫秒= 30秒运行一次作业。所以你每隔30秒就会触发你的东西(SimpleTrigger会完成这项工作)。

因此,'while'循环消失,它将由石英自动处理。 在工作中,你只能使用队列。目前还不清楚是谁填补了这个队列,但它看起来像是一个不同的问题。

很难确切地说你如何翻译队列,但一般来说应该

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

    最后但并非最不重要的是,spring与Quartz完美融合 请参阅第33.6章Here

    希望这有帮助