2017-10-06 1 views
1

Ich versuche, eine temporäre JMS-Warteschlange mit JMS 2.0 in Wildfly 10 und eine injizierte Verbindungsfactory zu erstellen.Wie erstellt man einen Listener in einer JMS Temporary Queue auf einem JEE Server (Wildfly)?

Ich injiziere meine ConnectionFactory mit @JMSConnectionFactory. Das funktioniert gut.

@Inject @JMSConnectionFactory("java:/jms/RemoteConnectionFactory") JMSContext jmsContext 

Erstellen auch eine temporäre Warteschlange funktioniert:

Destination jmsQueue = jmsContext.createTemporaryQueue(); 

einen Verleger erstellen und Nachrichten veröffentlichen arbeitet in Ordnung auch:

JMSProducer producer = jmsContext.createProducer(); 
TextMessage msg = jmsContext.createTextMessage(Long.toString(new Date().getTime())); 
producer.send(jmsQueue, msg); 

Doch wie erstelle ich einen Hörer für die Warteschlange? Ich kann keine MDB verwenden, da die temporäre Warteschlange nicht vordefiniert ist. Wenn ich versuche, einen Verbraucher zu erstellen, und weisen Sie ihm eine Nachricht Hörer, ich die folgende Fehlermeldung:

JMSConsumer consumer = jmsContext.createConsumer(jmsQueue); 
    consumer.setMessageListener(new MessageListener() { 
       ... 
       ... 
      }); 

Fehler-Trace:

Caused by: javax.jms.IllegalStateException: This method is not applicable inside the application server. See the J2EE spec, e.g. J2EE1.4 Section 6.6 
     at org.apache.activemq.artemis.ra.ActiveMQRASession.checkStrict(ActiveMQRASession.java:1452) 
     at org.apache.activemq.artemis.ra.ActiveMQRAMessageConsumer.setMessageListener(ActiveMQRAMessageConsumer.java:123) 
     at org.apache.activemq.artemis.jms.client.ActiveMQJMSConsumer.setMessageListener(ActiveMQJMSConsumer.java:59) 

So scheint es, dass ich nicht explizit eine Nachricht festlegen Listener mit einer JEE-kontrollierten Verbindungsfactory. Da es sich jedoch um eine temporäre Warteschlange handelt, kann ich keine MDB erstellen, da das Ziel zur Kompilierungszeit nicht bekannt ist. Wie höre ich also eine temporäre Warteschlange?

Antwort

1

Ich konnte dieses Problem nur mit JMS 1.0 lösen. Ich hatte so etwas wie Code:

TopicConnectionFactory topicConnectionFactory; 
Topic topic; 
TopicConnection topicConnection; 

try { 
    InitialContext context = new InitialContext(); 
    topicConnectionFactory = (TopicConnectionFactory)jndi.lookup("jboss/DefaultJMSConnectionFactory"); 
    topic = (Topic)jndi.lookup("jms/myTopicName"); 

    topicConnection = topicConnectionFactory.createTopicConnection(); 

    TopicSession topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); 

    TopicSubscriber topicSubscriber = topicSession.createSubscriber(projectTopic, null, false); 
    topicSubscriber.setMessageListener(listenerClass); 
    topicConnection.start(); 
} 
... 

wo listenerClass eine Klasse, die javax.jms.MessageListener implementiert.

Dies nutzt die vordefinierte JMS-Verbindungsfactory, die in Wildfly definiert wurde, innerhalb von standalone-full.xml, so dass ich keine explizite einrichten muss.

Als Warnung - der letzte, den ich diesen Code lief in Wildfly 8 war, so dass einige Dinge ein bisschen geändert haben können. Außerdem habe ich keine Remote-Verbindungen verwendet, so dass es wieder Unterschiede geben kann.

+0

Danke - Ich habe das auch versucht, aber immer noch die gleiche Ausnahme geworfen. Nicht besonders überrascht, da der Client immer noch dieselbe ActiveMARASession verwendet, egal ob er JMS2 oder JMS1 facade verwendet. Ich kann mir nicht vorstellen, dass es dafür keine logische Lösung gibt. –

+0

Warum brauchen Sie überhaupt eine temporäre Warteschlange? Wenn Sie erwarten, dass der Container mdb-Instanzen für die gesamte Lebensdauer der Bereitstellung bereitstellt, muss die Warteschlange ebenfalls vorhanden sein, sonst würden sie anhängen. –

+0

@willt Ich benötige eine Publish/Subscribe-Warteschlange, die für jeden Knoten in meinem Cluster eindeutig ist. Die Warteschlange musste für die Laufzeit der Laufzeit leben. Es muss nicht erneut gestartet werden. Außerdem möchte ich diese Warteschlangen nicht manuell verwalten müssen. Daher die Idee einer temporären Warteschlange ... Aber wenn es keine Möglichkeit gibt, darauf zu hören, was ist dann überhaupt der Zweck einer temporären Warteschlange in jee? –

Verwandte Themen