2016-08-04 11 views
1

Ich habe ein EJB-Projekt eingerichtet, um ein Persistence-Entitätsobjekt über JMS an eine MDB zu senden. Ich verwende JBoss EAP 7 mit Apache ActiveMQ als Messaging-Provider. Ich habe die ConnectionFactory- und Schlange wie so:JMS-Nachrichtenproduzent sendet keine Nachricht an die Warteschlange

AccountAccessQueue

ConnectionFactory

Das ist meine Botschaft Produzent, der ein ‚Konto‘ Entitätsobjekt als Parameter empfängt und sendet sie an die Warteschlange:

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(); 
     } 
    } 
} 

Die MDB empfängt die Nachricht aus der Warteschlange und verarbeitet sie:

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(); 
     } 
    } 
} 

nicht sicher, was ich bin immer falsch. Ich habe wahrscheinlich den Code, um die ConnectionFactory und die Warteschlange falsch einzurichten, aber ich bin nicht sicher, da ich neu in Java EE bin. Jede Hilfe wird geschätzt.

+0

Jeder Stack-Trace auf den Server-Logs? Irgendwelche Ausnahmen? –

+0

@RamachandranGA Nein, alles funktioniert einfach, aber der Teil, wo die MDB Ergebnisse anzeigen soll, funktioniert nicht. Außerdem zeigt die Überwachung der Warteschlange im JBoss-Admin-Steuerfeld, dass in der Warteschlange keine Nachrichten gesendet wurden. Ich kann nicht genau feststellen, was ich falsch mache. –

+2

möglicherweise gibt es ein Problem mit der Transaktion, und Ihre Nachricht wird nicht übergeben .. versuchen Sie, die Sitzung zu ändern .. Sitzung Sitzung = connection.createSession (false, Session.AUTO_ACKNOWLEDGE); – mendieta

Antwort

1

Dank @mendieta habe ich das Problem behoben. Ich habe JMS-Sessions gelesen und es hat Sinn gemacht. diese Zeile in EntityEnqueueBean.java Ändern der Trick:

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

Ich habe ein Problem behoben, indem ich das Gegenteil tat. Session.AUTO_ACKNOWLEDGE -> Sitzung.SESSION_TRANSACTED. – Edza

Verwandte Themen