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?
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. –
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? –
@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? –