如何使用计时器重新安排任务?

时间:2013-11-27 12:28:15

标签: java multithreading jms

这是我的问题,我正在使用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

欢迎任何改进或建议或解决方案的想法。

3 个答案:

答案 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。存储任务,以便以后取消它们。