【问题标题】:How to synchronize onMessage() of MessageListenerMessageListener的onMessage()如何同步
【发布时间】:2012-02-27 06:37:27
【问题描述】:

我有一个 spring3 Web 应用程序。我使用 org.springframework.jms.listener.DefaultMessageListenerContainer 来配置我的消息侦听器。我注册了一个 MDPOJO。我想要的是,当 onMessage() 正在为特定请求执行时,其他人应该等到第一个请求完成。换句话说,onMessage() 方法调用进一步的工作流程,完成它需要时间。其他消息在确认先前的请求完成之前,onMessage 不应选择队列中的队列。

是否可以同步处理onMessage()。我需要做以下事情:

  1. 用户将发布 n 条消息到队列中
  2. 我应该有一个界面,用户可以在其中从队列中删除消息。
  3. 当一条消息正在处理中时,不应接收任何其他消息。
  4. 用户应该能够更改消息处理的优先级

【问题讨论】:

  • 你真的需要使用 JMS 和消息队列吗?如果是这样,也许你会尝试只配置一个队列的消费者(即setConcurrentConsumers(1)
  • 很好。现在我必须以编程方式监控 JBoss Queue。是否可以使用 java 代码跟踪 JBoss 队列的状态?我可能必须删除某些我不想处理的消息。我还需要更改处理的优先级。我尝试了不同的机制。我尝试了middlewaremagic.com/jboss/?tag=jms 中的方法。但似乎不起作用
  • JMS 队列的监控依赖于平台。您使用的 JBoss Messaging 版本是什么?
  • 我使用默认值和 jboss-5.1.0.GA

标签: spring jms ejb-3.0 jboss5.x


【解决方案1】:

我可以使用以下代码以编程方式列出队列中的消息:

public void listAllJMS_Messages() 
    {
        try {
            ObjectName objectName=new ObjectName("jboss.messaging.destination:name=DLQ,service=Queue");
            List ls = (List) server.invoke(objectName, "listAllMessages" , null, null);
            List<javax.jms.Message> messages=(List<javax.jms.Message>)server.invoke(objectName, "listAllMessages" , null, null);
            int count=0;
            for(javax.jms.Message msg : messages) {
                System.out.println((++count)+"t"+msg.getJMSMessageID());
               if(msg.getJMSType() != null && msg.getJMSType().equalsIgnoreCase("Text")) {
                TextMessage text = (TextMessage)msg; 
                System.out.println(text.getText());
               }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

        // System.out.println((++count)+"t"+msg.getText());
    }

但是上面的代码列出了来自那些队列的消息,这些消息到目前为止还没有任何消费者。我的情况是,我有一个 MDPOJO 作为同步处理消息的消息消费者。我仍然想要从队列中列出消息,以便用户可以根据需要删除它。上面的代码返回空列表,以防我有队列的消费者。

【讨论】:

  • 管理 API 在此处描述:docs.jboss.org/jbossmessaging/docs/usermanual-2.0.0.beta4/html/…。它也包含一些样本。
  • 我浏览了文档。我仍然找不到解决方案。我想知道是否有一种方法可以监控当前正在使用的 JBoss 消息队列。当我的队列运行时,一切正常根本没有消费者。如果我有消费者,那么只有 messgaeCount 可以正常工作。列表消息返回 null
  • 您是否尝试过通过 JMX 客户端(例如 JConsole)?如果您可以从 JMX 客户端列出和删除消息,则可以通过编程方式完成。
  • 我通过 JMX 控制台进行了尝试。我通过单击 listAllMessages 尝试使用 localhost:8080/jmx-console,尽管 messageCount 为 3,但它返回 null。看看 issues.jboss.org/browse/JBMESSAGING-1729。如果目前有消息消费者,似乎它可能不会列出消息
  • 您真的需要使用 JMS 提供程序吗?一个简单的 ConcurrentHashMap 能完成这项工作吗?
猜你喜欢
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 2021-11-01
  • 2019-04-12
  • 2021-01-18
  • 2010-12-07
相关资源
最近更新 更多