Filtrage du récepteur de message JMS par JMSCorrelationID
Comment puis-je instancier un écouteur de file d'attente JMS dans Java (JRE/JDK/J2EE 1.4) qui ne reçoit que les messages qui correspondent à un JMSCorrelationID donné? Les messages que je cherche à ramasser ont été publiés dans une file d'attente et non dans un sujet, bien que cela puisse changer si nécessaire.
Voici le code que j'utilise actuellement pour mettre le message dans la file d'attente:/**
* publishResponseToQueue publishes Requests to the Queue.
*
* @param jmsQueueFactory -Name of the queue-connection-factory
* @param jmsQueue -The queue name for the request
* @param response -A response object that needs to be published
*
* @throws ServiceLocatorException -An exception if a request message
* could not be published to the Topic
*/
private void publishResponseToQueue(String jmsQueueFactory,
String jmsQueue,
Response response)
throws ServiceLocatorException {
if (logger.isInfoEnabled()) {
logger.info("Begin publishRequestToQueue: " +
jmsQueueFactory + "," + jmsQueue + "," + response);
}
logger.assertLog(jmsQueue != null && !jmsQueue.equals(""),
"jmsQueue cannot be null");
logger.assertLog(jmsQueueFactory != null && !jmsQueueFactory.equals(""),
"jmsQueueFactory cannot be null");
logger.assertLog(response != null, "Request cannot be null");
try {
Queue queue = (Queue)_context.lookup(jmsQueue);
QueueConnectionFactory factory = (QueueConnectionFactory)
_context.lookup(jmsQueueFactory);
QueueConnection connection = factory.createQueueConnection();
connection.start();
QueueSession session = connection.createQueueSession(false,
QueueSession.AUTO_ACKNOWLEDGE);
ObjectMessage objectMessage = session.createObjectMessage();
objectMessage.setJMSCorrelationID(response.getID());
objectMessage.setObject(response);
session.createSender(queue).send(objectMessage);
session.close();
connection.close();
} catch (Exception e) {
//XC3.2 Added/Modified BEGIN
logger.error("ServiceLocator.publishResponseToQueue - Could not publish the " +
"Response to the Queue - " + e.getMessage());
throw new ServiceLocatorException("ServiceLocator.publishResponseToQueue " +
"- Could not publish the " +
"Response to the Queue - " + e.getMessage());
//XC3.2 Added/Modified END
}
if (logger.isInfoEnabled()) {
logger.info("End publishResponseToQueue: " +
jmsQueueFactory + "," + jmsQueue + response);
}
} // end of publishResponseToQueue method
J'ai lu sur le même sujet récemment et poser une question comme suit: sera le récepteur encore recevoir ces messages qui ne contiennent pas l'identifiant de corrélation nécessaire et de les déposer en silence w/o le traitement, ou bien les Fournisseur JMS lui-même ne pas livrer de tels messages au récepteur, de sorte qu'ils restent toujours dans la file d'attente? Je pense que ce dernier est la bonne approche, mais je veux vérifier. Merci. – shrini1000
@ shrini1000 vous avez raison. – Trying