How can I instantiate a JMS queue listener in java (JRE /JDK / J2EE 1.4) that only receives messages that match a given JMSCorrelationID? The messages that I’m looking to pick up have been published to a queue and not a topic, although that can change if needed.
Here’s the code that I’m currently using to put the message in the queue:/** * 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
The queue connection setup is the same, but once you have the QueueSession, you set the selector when creating a receiver.
then
or