这是我的问题,我正在使用JMS向队列发送一些消息。该程序的编写方式是,在发送上一条消息之后的30秒内会有一条消息发送到队列。如果在30秒的持续时间内没有发送消息,则消息是最后一条消息,我应该开始使用队列中的消息。
我的初步想法是创建一个带有任务的计时器(这里从队列接收消息),当创建新消息时,调用该方法并且任务等待30秒。如果再次调用该方法意味着另一条消息已经出现,则必须重新安排该任务。
这是我写的代码:
public void startTimer() {
Timer t = new Timer();
try {
t.schedule(task, timeDelay);
} catch (Exception e) {
t.cancel();
t = new Timer();
t.schedule(task, timeDelay);
}
}
我正在尝试安排计时器,如果有计划的现有任务,那么我将取消该计时器,创建一个新计时器并安排新任务。
我收到错误消息为Task already scheduled or cancelled
。
欢迎任何改进或建议或解决方案的想法。
答案 0 :(得分:4)
您不能在一个或多个TimerTask
中使用相同的Timer
。
您需要创建要执行的TimerTask
的新实例:
t.cancel();
t = new Timer();
TimerTask newTask = new MyTimerTask(); // new instance
t.schedule(newTask, timeDelay);
答案 1 :(得分:1)
你确定Timers是要走的路吗?听起来你应该监听最长等待时间的消息。像这样的东西(伪代码);
boolean timeout = false;
while (!timeout) {
// Read a message within 30 seconds
try {
Message msg = consumer.receive( 30000 );
} catch (JMSException jmse) {
timeout=true;
}
// Process the message here
process(msg);
}
// Timed-out while waiting for a message, so process messages in the queue
processQueue();
将它放在一个函数中并重复调用它。如果您需要多线程功能,请将其包装在Thread或Runnable中。
答案 2 :(得分:1)
重新使用你的Timer,并在取消它们后重新创建你的TimerTasks。存储任务,以便以后取消它们。