2017-10-06 7 views
1

J'essaie de créer une file d'attente JMS temporaire en utilisant JMS 2.0 dans Wildfly 10 et une fabrique de connexions injectées.Comment créer un écouteur sur une file d'attente temporaire JMS dans un serveur JEE (Wildfly)?

J'injecte mon ConnectionFactory en utilisant @JMSConnectionFactory. Cela fonctionne bien.

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

Création d'une file d'attente temporaire fonctionne aussi très bien:

Destination jmsQueue = jmsContext.createTemporaryQueue(); 

Création d'un éditeur et la publication de messages fonctionne bien ainsi:

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

Cependant, comment puis-je créer un écouteur pour la queue? Je ne peux pas utiliser de MDB car la file d'attente temporaire n'est pas prédéfinie. Si je tente de créer un consommateur, et attribuer un écouteur de message à, je reçois le message d'erreur suivant:

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

trace d'erreur:

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) 

Il semble donc que je ne peux pas explicitement définir un message écouteur avec une usine de connexion contrôlée par JEE. Mais étant donné qu'il s'agit d'une file d'attente temporaire, je ne peux pas créer de MDB car la destination n'est pas connue au moment de la compilation. Alors, comment puis-je écouter une file d'attente temporaire?

Répondre

1

J'ai seulement pu résoudre ce problème en utilisant JMS 1.0. Je code quelque chose comme l'avait:

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

listenerClass est une classe qui implémente javax.jms.MessageListener.

Ceci profite de la fabrique de connexions JMS prédéfinie définie dans Wildfly au sein de standalone-full.xml de sorte que je n'ai pas besoin d'en configurer une explicite.

Comme un avertissement - la dernière fois que j'ai couru ce code était en Wildfly 8, donc certaines choses ont peut-être changé un peu. De plus, je n'utilisais pas les connexions à distance, donc, encore une fois, il peut y avoir quelques différences.

+0

Merci - J'ai essayé cela aussi, mais toujours obtenir la même exception levée. Pas particulièrement surpris puisque le Client utilise toujours le même ActiveMARASession, qu'il utilise la façade JMS2 ou JMS1. Je ne peux pas imaginer qu'il n'y a pas de solution logique à cela. –

+0

Pourquoi avez-vous besoin d'une file d'attente temporaire? Si vous attendez que le conteneur fournisse des instances mdb pour la durée de vie du déploiement, alors cela nécessite également l'existence de la file d'attente, sinon à quoi s'attacheraient-ils? –

+0

@J'aurai besoin d'une file d'attente de publication/abonnement propre à chaque nœud de mon cluster. La file d'attente devait durer toute la durée de l'exécution; il n'a pas besoin de persister à redémarrer. De plus, je ne veux pas avoir à gérer ces files d'attente manuellement. D'où l'idée d'une file d'attente temporaire ... Mais s'il n'y a aucun moyen de l'écouter, alors quel est le but d'une file d'attente temporaire du tout dans jee? –