我的进程正在收听 JMS 主题。当它收到消息时,我正在处理它并将其添加到列表中。说
List<ProcessedMessage>
我必须将此列表发送到 XMLGenerator。但我想在此之前等待/睡觉 5 分钟。
5 分钟后,我的列表大小无关紧要。我想将它转发给 XMLGenerator 方法。
Thread.sleep(5*60*1000) 是安全的还是会让每个线程进入睡眠状态,这将携带消息并在睡眠 5 分钟后唤醒所有这些线程?我不确定这是否会成为主线程。请帮忙。
我的进程正在收听 JMS 主题。当它收到消息时,我正在处理它并将其添加到列表中。说
List<ProcessedMessage>
我必须将此列表发送到 XMLGenerator。但我想在此之前等待/睡觉 5 分钟。
5 分钟后,我的列表大小无关紧要。我想将它转发给 XMLGenerator 方法。
Thread.sleep(5*60*1000) 是安全的还是会让每个线程进入睡眠状态,这将携带消息并在睡眠 5 分钟后唤醒所有这些线程?我不确定这是否会成为主线程。请帮忙。
在 JMS 消息处理代码中使用 sleep() 确实不是一个好主意。它会占用连接资源,您很可能会遇到超时之一(例如事务或连接超时),因此它不会长时间延迟。
更好的实现是有一个单独的类来保存你的消息列表(MessagesCollector),你只有一个实例。您的 JMS 消息处理代码会将消息添加到 MessagesCollector 并立即成功返回。然后,您可以在 MessageCollector 中使用单独的方法,该方法每 5 分钟由计时器触发一次,该方法将获取到目前为止已收集到的任何数量的消息并将它们发送到您的 XMLGenerator,然后清除集合。只要确保在 MessageCollector 实现中正确处理同步即可。
MessageCollector 签名可能如下所示:
public MessageCollector {
public synchronized void addMessage(Object message);
public synchronized void sendCollectedMessages();
}
在上面的代码中,JMS 处理代码将调用 addMessage() 并且计时器将调用 sendCollectedMessages()
Java EE 限制规定您不应自己管理线程。
我建议使用 javax.ejb.TimerService。
Thread.sleep 只会让当前线程休眠而不是所有线程。
在您的情况下,您绝对不应该将 Thread.sleep 放在 onMessage 回调中。
一些计时器服务可能是要走的路。或者,您可以轻松地实例化一个休眠然后发送消息的线程。如其他答案所述,在清空可以同时写入的消息列表时要小心并发。