线程休眠处理JMS消息时

时间:2013-10-24 19:52:43

标签: java multithreading jms

我的流程正在收听JMS主题。当它收到消息时,我正在处理它并将其添加到列表中。 说

  List<ProcessedMessage>

我必须将此列表发送到XMLGenerator。 但是在我这样做之前,我想等待/睡5分钟。

5分钟后,无论我的名单大小都无关紧要。我想将它转发到XMLGenerator方法。

Thread.sleep(5 * 60 * 1000)是安全的,还是会让每一个线程都进入睡眠状态,它会传输消息并在睡眠5分钟后唤醒所有这些线程? 我不确定这是否是主线程。 请帮忙。

3 个答案:

答案 0 :(得分:2)

在JMS消息中使用sleep()处理代码真的不是一个好主意。它会占用连接资源,并且您很可能遇到其中一个超时(例如事务或连接超时),因此它不适用于长时间延迟。

更好的实现是使用单独的类来保存您的消息列表(MessagesCollector),您只有一个实例。您的JMS消息处理代码将向MessagesCollector添加消息并立即成功返回。然后,您可以在MessageCollector中使用单独的方法,该方法将每5分钟由计时器触发,这将捕获到目前为止收集的任何数量的消息并将它们发送到XMLGenerator,之后清除集合。只需确保在MessageCollector实现中正确处理同步。

MessageCollector签名可能如下所示:

public MessageCollector {
  public synchronized void addMessage(Object message);
  public synchronized void sendCollectedMessages();
}

在上面的代码中,JMS处理代码会调用addMessage(),而timer会调用sendCollectedMessages()

答案 1 :(得分:1)

Java EE限制规定您不应自行管理线程。

我建议使用javax.ejb.TimerService。

答案 2 :(得分:0)

Thread.sleep只会将当前线程置于休眠状态而不是所有线程。

在你的情况下,你绝对不应该把Thread.sleep放在onMessage回调中。

某些定时服务可能是最佳选择。或者,您可以轻松地实例化一个休眠的线程,然后发送消息。正如其他答案中所述,在清空可以同时写入的消息列表时要小心并发。