Java 处理JMS消息时线程休眠

Java 处理JMS消息时线程休眠,java,multithreading,jms,Java,Multithreading,Jms,我的过程是收听JMS主题。当它收到消息时,我正在处理它并将其添加到列表中。 说 列表 我必须将此列表发送到XMLGenerator。 但我想等/睡5分钟再这样做 5分钟后,无论我的名单有多大都无关紧要。我想将其转发到XMLGenerator方法 一个Thread.sleep(5*60*1000)是安全的,还是会让每一个线程都进入睡眠状态,从而在睡眠5分钟后唤醒所有线程? 我不确定这是否会成为主线。 请提供帮助。在JMS消息处理代码中使用sleep()确实不是一个好主意。它会占用连接资源,并且您

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

列表
我必须将此列表发送到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()

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

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

在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。

JavaEE限制声明您不应该自己管理线程


我建议使用javax.ejb.TimerService。

JavaEE限制声明您不应该自己管理线程


我建议使用javax.ejb.TimerService。

JavaEE限制声明您不应该自己管理线程


我建议使用javax.ejb.TimerService。

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

在您的情况下,您绝对不应该将Thread.sleep放在onMessage回调中


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

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

在您的情况下,您绝对不应该将Thread.sleep放在onMessage回调中

一些定时服务可能是最好的选择。