如何同步MessageListener的onMessage()

时间:2012-02-27 06:37:28

标签: spring jms ejb-3.0 jboss5.x

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

是否可以同步处理onMessage()。我需要执行以下操作:

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

1 个答案:

答案 0 :(得分:0)

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

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作为消息使用者同步处理消息。我仍然需要来自队列的列表消息,以便用户可以根据需要删除它。如果我有队列的消费者,则代码返回空列表。