通过JMSCorrelationID过滤JMS消息接收器
时间:2020-03-06 14:52:42 来源:igfitidea点击:
这是我当前用于将消息放入队列中的代码:
/**
* 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
解决方案
队列连接设置相同,但是一旦有了QueueSession,就可以在创建接收方时设置选择器。
QueueReceiver receiver = session.createReceiver(myQueue, "JMSCorrelationID='theid'");
然后
receiver.receive()
或者
receiver.setListener(myListener);
顺便说一句,虽然这不是我们要尝试通过JMS实现请求响应的实际问题,但我建议我们阅读本文,因为JMS API比我们想象的要复杂得多,而有效地做到这一点比看起来要难得多。
特别是为了有效地使用JMS,我们应该尝试避免为单个消息等创建使用者。
另外,由于JMS API非常复杂,无法正确有效地使用,特别是在池,事务和并发处理中,因此我建议人们将中间件从其应用程序代码中隐藏起来,例如使用Apache Camel的JMS的Spring Remoting实现

