java - 处理 JMS 消息时线程 hibernate

标签 java multithreading jms

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

  List<ProcessedMessage>

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

5 分钟后,无论我的列表有多大,都不再重要了。我想将其转发到 XMLGenerator 方法。

Thread.sleep(5*60*1000) 是否安全,还是会让每个线程进入休眠状态,该线程将携带消息并在 sleep 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 - 处理 JMS 消息时线程 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19575322/

相关文章:

java - java中的可变参数

java - 为什么我应该使用 JMS 而不是 RMI+Queue?

java - 如何强制对象捕捉到网格?

java - 如何在级联中仅从一行中获取某些列

java - infinispan hibernate 缓存驱逐

c# - 何时将对象返回到其池中

c++ - C++中的unique_lock和shared_lock有什么区别

c - getrlimit() 返回错误值?

java - 有没有办法在 JUnit 测试中使用 JMS?

java - Apache Camel Junit 保持 Context 运行