2010-11-23 54 views
3

我已经完成了大量的工作来从Web服务中检索一些数据,但现在有调度请求的问题,我不确定从哪里开始。如何执行任务调度?

我听JMS队列事件并在接收到事件的我需要一个持续时间后,Web服务的请求。持续时间取决于事件属性。如果Web服务返回false,我需要继续安排请求,直到它返回true。

我想创建于在收到一个事件或错误的响应队列查找请求,但这似乎并不理想 - 我会不断地消费消息,检查时间,看看是否请求如果没有的话,应该把它还给队列。

如果任何人有关于如何实现这样一个问题,我会很感激的建议。

回答

0

我决定去与已在第3版中引入,提供统筹,调度基于时间和间隔都时刻,如果需要更多的定制它有一个cron选项​​。我没有深入探讨Quartz可以实现的深度,但它也提供了与Quartz的整合。

5

首先,确保你保持的事件队列在其所需要执行的顺序。这将确保您只需查看队列的头部即可查看应安排下一个事件的时间。你可以用这个PriorityQueue

处理事件的线程将轮询该队列中的项目并处理它们。查看头部项目并查看下一个事件何时需要运行。选择一个对象用作锁定对象,并让主线程在该对象上调用Object.wait(long),将该方法传递给毫秒数,直到需要运行下一个事件。

如果一个新的线程时,它将在适当的位置添加到队列中。如果该项目位于队列的头部,这意味着线程需要尽快唤醒。在锁对象上调用Object.notifyAll()以唤醒处理线程。它会看到没有任何东西需要处理,并在适当的时间内重新入睡。

 
public class ProcessingQueue extends Thread { 

    private PriorityQueue<Task> tasks; 

    private volatile boolean isRunning = true; 

    public void addTask(Task t) { 
    synchronized (this.tasks) { 
     this.tasks.offer(t); 
     // this call requires synchronization to this.tasks 
     this.tasks.notifyAll(); 
    } 
    } 

    public void shutdown() { 
    this.isRunning = false; 
    synchronized (this.tasks) { 
     this.notifyAll(); 
    } 
    } 

    public void run() { 
    while (this.isRunning) { 
     synchronized (this.tasks) { 
     Task t = this.tasks.peek(); 
     // by default, if there are no tasks, this will wake every 60 seconds 
     long millisToSleep = 60000; 
     // getExecuteMillis() should return the time, in milliseconds, for execution 
     if (t != null) millisToSleep = t.getExecuteMillis() - System.currentTimeMillis(); 
     if (millisToSleep > 0) { 
      try { 
      // this line requires synchronization to this.tasks 
      // and the lock is removed while it waits 
      this.tasks.wait(millisToSleep); 
      } catch (InterruptedException e) { 
      } 
     } 
     t = this.tasks.poll(); 
     if (t != null) { 
      t.execute(); 
     } 
     } 
    } 
    } 
} 
+0

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/DelayQueue.html看看Java的延迟队列。非常适合基于时间的任务队列。这里是源代码http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/concurrent/DelayQueue.java#DelayQueue.take%28%29 – Anshul 2015-12-06 10:24:48