有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java线程在处理JMS消息时休眠

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

  List<ProcessedMessage>

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

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

我要一根线。睡眠(5*60*1000)是安全的,还是会让每一个线程都进入睡眠状态,从而在睡眠5分钟后唤醒所有线程? 我不确定这是否会成为主线。 请帮忙


共 (3) 个答案

  1. # 1 楼答案

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

    我建议使用javax。ejb。时间服务

  2. # 2 楼答案

    线。睡眠只会使当前线程进入睡眠状态,而不是使所有线程进入睡眠状态

    在你的情况下,你绝对不应该把线。睡在onMessage的电话里

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

  3. # 3 楼答案

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