我已经完成了大量的工作来从Web服务中检索一些数据,但现在有调度请求的问题,我不确定从哪里开始。如何执行任务调度?
我听JMS队列事件并在接收到事件的我需要一个持续时间后,Web服务的请求。持续时间取决于事件属性。如果Web服务返回false,我需要继续安排请求,直到它返回true。
我想创建于在收到一个事件或错误的响应队列查找请求,但这似乎并不理想 - 我会不断地消费消息,检查时间,看看是否请求如果没有的话,应该把它还给队列。
如果任何人有关于如何实现这样一个问题,我会很感激的建议。
我已经完成了大量的工作来从Web服务中检索一些数据,但现在有调度请求的问题,我不确定从哪里开始。如何执行任务调度?
我听JMS队列事件并在接收到事件的我需要一个持续时间后,Web服务的请求。持续时间取决于事件属性。如果Web服务返回false,我需要继续安排请求,直到它返回true。
我想创建于在收到一个事件或错误的响应队列查找请求,但这似乎并不理想 - 我会不断地消费消息,检查时间,看看是否请求如果没有的话,应该把它还给队列。
如果任何人有关于如何实现这样一个问题,我会很感激的建议。
我决定去与已在第3版中引入,提供统筹,调度基于时间和间隔都时刻,如果需要更多的定制它有一个cron选项。我没有深入探讨Quartz可以实现的深度,但它也提供了与Quartz的整合。
使用现有的OSS调度:http://java-source.net/open-source/job-scheduler
你总是可以滚你自己的,但我不推荐。
调度程序的一个重要特性应该是它能够在重启/崩溃时幸存下来。
首先,确保你保持的事件队列在其所需要执行的顺序。这将确保您只需查看队列的头部即可查看应安排下一个事件的时间。你可以用这个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(); } } } } }
我同意使用3D方库。我使用石英框架。 http://www.quartz-scheduler.org/
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