2012-02-05 51 views
1

我有一個消息驅動EJB的問題。 我也有包含MessageDrivenBean的應用程序Web Service和EJB應用程序。JMS和MessageDriven EJB Bean

要發送消息給JMS我使用ObjectMessage我: 這裏是我的代碼:

 Connection connection = connectionFactory.createConnection(); 
     Session session = connection.createSession(false, 1); 
     MessageProducer messageProducer = session.createProducer(queue); 
     ObjectMessage outMessage = session.createObjectMessage(); 
     outMessage.setObject(((Serializable) operation)); 
     LOGGER.debug("Sending message..."); 
     messageProducer.send(outMessage); 
     LOGGER.debug("Sending message: done."); 
     messageProducer.close(); 
     session.close(); 
     connection.close(); 

當我打電話給我的web服務,我調用此方法爲好。該消息在MDB中得到並開始處理。這是我的MDB代碼:

@MessageDriven(mappedName = "jms/cbsDestination", activationConfig = { 
     @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), 
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") 
}) 
    public class OperationsBackgroundService implements MessageListener { 
      //Some code.... 
     public void onMessage(Message message) { 
    LOGGER.debug("Got message: " + message.toString()); 
    if (message instanceof ObjectMessage) { 

     ObjectMessage objectMessage = (ObjectMessage) message; 
     Operation operation = null; 
    } 

它的一切正常,我得到的消息,它開始處理,它結束,因爲我期望。

但問題是: 當我發送第一條消息到MDB時,它開始處理它(OK),然後,當第一條消息正在處理時,我發送第二條消息到我的MDB,並且它也開始處理它。我知道JMS的特點是,如果我發送一條消息並且正在處理一條消息,則其他消息將等待,直到處理完第一條消息。或者我在這裏錯過了什麼?請幫忙。也許有一些屬性我忘了設置?

感謝身份證前進。

回答

0

您的應用程序服務器創建了多個OperationsBackgroundService實例並將每個實例註冊爲使用者。每個消費者一次只能處理一條消息,但如果有2個消費者,則可以同時處理2條消息。這是一個功能,而不是一個錯誤。

如果要實現單線程處理,只需告訴應用程序服務器爲每個MDB創建一個使用者。請查閱您的應用程序服務器文檔以瞭解如何配置它。

+0

我使用的是glassfish 2.1.1,但我無法找到任何關於如何爲每個MDB創建一個用戶的信息。也許有人能告訴我?謝謝 – 2012-02-05 20:50:27

+0

@PauliusMatulionis:看看[Tuning Message-Driven Beans](http://docs.oracle.com/cd/E18930_01/html/821-2431/abebw.html#abedi) - 它適用於Glassfish 3,但它應該指向你一個正確的方向。提示:* pool size * – 2012-02-05 21:07:41

+0

沒錯,如果你只想處理一條消息,你將不得不限制你的MDB池爲一個實例(奇怪的用例,但可能) – Kris 2012-02-05 21:13:51