2016-08-04 173 views
1

我設置了一個EJB項目以使用JMS將持久性實體對象發送到MDB。我使用的是使用Apache ActiveMQ作爲消息傳遞提供程序的JBoss EAP 7。餘設置像這樣的ConnectionFactory和隊列:JMS消息生產者不會將消息發送到隊列

AccountAccessQueue

ConnectionFactory

這是接收「帳戶」實體對象作爲參數,並將其發送到隊列我的消息生產者:

EntityEnqueueBean.java

@Stateless 
@LocalBean 
public class EntityEnqueueBean { 

    Context context = null; 

    public void enqueueEntity(Account accountEntity) {  
     try { 
      context = new InitialContext(); 
      ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("java:/ConnectionFactory"); 
      Destination queue = (Destination) context.lookup("java:/jms/queue/AccountAccessQueue"); 
      Connection connection = connectionFactory.createConnection(); 
      Session session = connection.createSession(true, Session.SESSION_TRANSACTED); 
      MessageProducer messageProducer = session.createProducer(queue); 
      ObjectMessage objectMessage = session.createObjectMessage(accountEntity); 
      messageProducer.send(objectMessage); 

      messageProducer.close(); 
      session.close(); 
      connection.close(); 
     } catch (JMSException | NamingException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

MDB從隊列接收消息並對其進行處理:

AccountPersistenceMDB.java

@MessageDriven(
    activationConfig = { @ActivationConfigProperty(
      propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
      @ActivationConfigProperty(propertyName = "destination", 
      propertyValue ="java:/jms/queue/AccountAccessQueue") 
    }) 
public class AccountPersitenceMDB implements MessageListener { 

    public void onMessage(Message message) { 
     ObjectMessage objectMessage = null; 
     objectMessage = (ObjectMessage) message; 
     try { 
      Account accountEntity = (Account) objectMessage.getObject(); 
      System.out.println("MDB accessCount: " + accountEntity.getAccessCount()); 
     } catch (JMSException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

不知道什麼,我得到錯誤的。我可能有代碼來設置ConnectionFactory和隊列錯誤,但我不確定,因爲我是Java EE的新手。任何幫助表示讚賞。

+0

對服務器日誌的任何堆棧跟蹤?任何例外? –

+0

@RamachandranGA不,一切正常,但MDB應該顯示結果的部分不起作用。另外,在JBoss管理面板上監視隊列顯示沒有消息在隊列上發送過。我無法確定我做錯了什麼。 –

+2

可能是交易存在問題,而您的郵件沒有被提交。嘗試將會話更改爲此.. Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); – mendieta

回答

1

感謝@mendieta我解決了這個問題。我閱讀了JMS會話,它非常有意義。改變這一行EntityEnqueueBean.java的伎倆:

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
+0

我通過相反的方式解決了一個問題。 Session.AUTO_ACKNOWLEDGE - > Session.SESSION_TRANSACTED。 – Edza