java - quartz ,调度过程始终存在

标签 java spring multithreading tomcat quartz-scheduler

目前,我有一个基于 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 自动处理。 在工作中,您只会使用队列。不清楚谁填满了这个队列,但这看起来像是一个不同的问题。

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

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

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

关于java - quartz ,调度过程始终存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37297327/

相关文章:

java - Spring Security 从远程访问访问请求,无需预先身份验证

java - 有没有一种方法可以执行计时器而无需在java中创建单独的线程?

java - SWT 文本字段设置和 RCP 命令绑定(bind)到键

java - 如何在 Java 中创建 API 来更改 Unix 用户的密码?

java - (无)参数构造函数的最佳方法 - ResponseBody - Spring

java - spring中线程提交任务,不等待完成

Eclipse Mars 中的 Java 程序立即终止且没有输出?

java - 保存子数据时传递的分离实体持久化

java - 为什么我的线程没有收到通知?

Java - 通过 ObjectOutputStream read/writeObject() 从服务器向客户端发送 ImageIcons 时出错