我的流程正在收听JMS主题。当它收到消息时,我正在处理它并将其添加到列表中。 说
List<ProcessedMessage>
我必须将此列表发送到XMLGenerator。 但是在我这样做之前,我想等待/睡5分钟。
5分钟后,无论我的名单大小都无关紧要。我想将它转发到XMLGenerator方法。
Thread.sleep(5 * 60 * 1000)是安全的,还是会让每一个线程都进入睡眠状态,它会传输消息并在睡眠5分钟后唤醒所有这些线程? 我不确定这是否是主线程。 请帮忙。
答案 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回调中。
某些定时服务可能是最佳选择。或者,您可以轻松地实例化一个休眠的线程,然后发送消息。正如其他答案中所述,在清空可以同时写入的消息列表时要小心并发。