消息以xml格式排队,其中包含标记a。 我必须阅读此标记,以便我的监听器不会选择包含a,b或c的destinationInstance的消息。
Xml如下:
<?xml version="1.0"?>
-<Envelope>
-<Header version="2.0">
<senderInstance>asas</senderInstance>
<destination>asassd</destination>
<destinationInstance>a</destinationInstance>
<correlationId>94825641</correlationId>
</Header>
-<Envelope>
Java代码:
public void listenMessage(final String qLookUpName,final JMSClientFactory jmsClientFactory,int noOfListeners) {
Queue queue = null;
QueueReceiver[] receiver = new QueueReceiver[noOfListeners + 1];
Message message = null;
queue = queueMap.get(qLookUpName);
tracer.info("Queue name - " + queue);
try {
if (null == queue) {
InitialContext ctx = new InitialContext(ldapProps);
queue = (javax.jms.Queue) ctx.lookup(qLookUpName);
queueMap.put(qLookUpName, queue);
}
logger.info("Entered listenJMSMessage()");
for (int receiverCnt = 0; receiverCnt < noOfListeners; receiverCnt++) {
try {
logger.debug("queuename : " + queue.getQueueName());
tracer.info("queuename : " + queue.getQueueName());
receiver[receiverCnt] = session.createReceiver(queue);
tracer.info("receiver : " + receiver);
logger.debug("Listening for Messages");
receiver[receiverCnt].setMessageListener(new MessageListener(){
JMSClientFactory clientFactory= jmsClientFactory;
Document xmlDocument;
public void onMessage(Message arg0) {
try {
logger.debug("got message "+ arg0.getJMSCorrelationID());
logger.debug("Received message from the queue :"
+ arg0.getJMSCorrelationID()+" On Listener :" + this);
String xmlResponse=((TextMessage)arg0).getText();
xmlDocument = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse(new InputSource(new StringReader(xmlResponse)));
String destinationInstance=xmlDocument.getElementsByTagName("destinationInstance").item(0).getTextContent();
logger.debug(" destinationInstance: " + destinationInstance);
if(destinationInstance.equalsIgnoreCase("a") || destinationInstance.equalsIgnoreCase("b") ||
destinationInstance.equalsIgnoreCase("c")){
logger.debug("Calling process(arg0) method.");
clientFactory.process(arg0);
}
} catch (JMSException e) {
logger.error("Exception - " , e);
// TODO Auto-generated catch block
//e.printStackTrace();
} catch (Exception e) {
logger.error("Exception - " , e);
} catch(Throwable t) {
logger.error("Error while dequeuing -", t);
} finally {
NDC.remove();
}
}
});
} catch (JMSException e) {
logger.debug("stack trace -" ,e);
}
}
} catch (NamingException e) {
logger.debug("NamingException stack trace -" ,e);
}
logger.debug("Listening for another message");
}
答案 0 :(得分:0)
默认的JMS API不允许基于此有效负载的消息选择。您将不得不阅读并解析它,但这将破坏性地阅读消息。
JMS消息选择器如果您的消息传递应用程序需要过滤 它收到的消息,您可以使用JMS API消息选择器, 它允许消息使用者指定消息 感兴趣的是。消息选择器分配过滤消息的工作 到JMS提供者而不是应用程序。举个例子 使用消息选择器的应用程序,请参阅应用程序 将JMS API与会话Bean一起使用。
消息选择器是包含表达式的String。语法 表达式的基础是SQL92条件的子集 表达式语法。示例中的消息选择器选择any 具有NewsType属性的消息,该属性设置为值'Sports' 或'意见':
NewsType ='Sports'或NewsType ='意见'createConsumer和 createDurableSubscriber方法允许您指定消息 创建消息使用者时,选择器作为参数。
消息使用者然后只接收其标题和消息的消息 属性与选择器匹配。 (请参阅消息标题和消息 属性。)消息选择器无法在此基础上选择消息 邮件正文的内容。
您可能希望查看浏览消息,检查有效负载,然后根据条件查看处理消息,但这是一个更长的解决方案,需要浏览,过滤然后阅读消息。这很麻烦。