【问题标题】:How to reschedule a task using timer?如何使用计时器重新安排任务?
【发布时间】:2013-12-13 02:22:42
【问题描述】:

这是我的问题,我正在使用 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 的错误消息。

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

【问题讨论】:

    标签: java multithreading jms


    【解决方案1】:

    您不能在一个或多个Timer 中使用相同的TimerTask

    您需要创建一个新的TimerTask 实例来执行:

    t.cancel();
    t = new Timer();
    TimerTask newTask = new MyTimerTask();  // new instance
    t.schedule(newTask, timeDelay);
    

    【讨论】:

    【解决方案2】:

    你确定定时器是要走的路吗?听起来您应该以最长的等待时间收听消息。像这样的东西(伪代码);

    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();
    

    把 this 放到一个函数中,反复调用。如果您需要多线程功能,请将其包装在 Thread 或 Runnable 中。

    【讨论】:

      【解决方案3】:

      重用您的计时器,并在取消它们后重新创建您的 TimerTask。存储任务,以便以后可以取消。

      【讨论】:

        猜你喜欢
        • 2021-07-04
        • 2010-10-12
        • 2016-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多