如何将xml文件的内容读取到Jms Queue

时间:2016-08-31 09:20:39

标签: java jms

消息以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");
}

1 个答案:

答案 0 :(得分:0)

默认的JMS API不允许基于此有效负载的消息选择。您将不得不阅读并解析它,但这将破坏性地阅读消息。

  

JMS消息选择器如果您的消息传递应用程序需要过滤   它收到的消息,您可以使用JMS API消息选择器,   它允许消息使用者指定消息   感兴趣的是。消息选择器分配过滤消息的工作   到JMS提供者而不是应用程序。举个例子   使用消息选择器的应用程序,请参阅应用程序   将JMS API与会话Bean一起使用。

     

消息选择器是包含表达式的String。语法   表达式的基础是SQL92条件的子集   表达式语法。示例中的消息选择器选择any   具有NewsType属性的消息,该属性设置为值'Sports'   或'意见':

     

NewsType ='Sports'或NewsType ='意见'createConsumer和   createDurableSubscriber方法允许您指定消息   创建消息使用者时,选择器作为参数。

     

消息使用者然后只接收其标题和消息的消息   属性与选择器匹配。 (请参阅消息标题和消息   属性。)消息选择器无法在此基础上选择消息   邮件正文的内容。

您可能希望查看浏览消息,检查有效负载,然后根据条件查看处理消息,但这是一个更长的解决方案,需要浏览,过滤然后阅读消息。这很麻烦。