2016-08-31 6 views
1

메시지는 내부에 태그가있는 xml 형식의 대기열에 있습니다. 리스너가 a, b 또는 c의 destinationInstance가 포함 된 메시지를 선택하지 않도록이 태그를 읽어야합니다.XML 파일의 내용을 Jms 대기열에 읽는 방법

XML은 다음과 같습니다 :

<?xml version="1.0"?> 

-<Envelope> 

    -<Header version="2.0"> 

     <senderInstance>asas</senderInstance> 

     <destination>asassd</destination> 

     <destinationInstance>a</destinationInstance> 

     <correlationId>94825641</correlationId> 

    </Header> 

-<Envelope> 

자바 코드 :

공공 무효 listenMessage (최종 문자열 qLookUpName, 최종 JMSClientFactory jmsClientFactory, noOfListeners를 INT) {

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

어떤 JMS 공급자를 사용합니까? –

답변

0

기본 JMS의 API 이 페이로드 기반의 메시지 선택을 허용하지 않습니다. 메시지를 읽고 파싱해야하지만 메시지를 파괴적으로 읽어야합니다.

JMS 메시지 선택기 메시징 응용 프로그램이 수신 메시지를 필터링 할 필요가있는 경우, 당신은 메시지 소비자가 관심 있는 메시지를 지정할 수있는 JMS API의 메시지 선택기, 를 사용할 수 있습니다. 메시지 선택기 할당 메시지 을 응용 프로그램이 아닌 JMS 제공자로 필터링하는 작업. 메시지 셀렉터를 사용하는 응용 프로그램 인 의 예는 세션 빈을 사용하여 JMS API를 사용하는 응용 프로그램을 참조하십시오.

메시지 선택기는 표현식을 포함하는 String입니다. 식의 구문은 SQL92 조건부 식 구문의 하위 집합을 기반으로합니다.

NewsType = '스포츠'OR NewsType = '의견'는 createConsumer 및 createDurableSubscriber :이 예에서 메시지 선택기 '스포츠' 또는 "의견"값으로 설정되는 NewsType 속성이 어떤 메시지를 선택 메서드를 사용하면 메시지 소비자를 만들 때 메시지로 선택기를 인수로 지정할 수 있습니다.

그러면 메시지 소비자는 머리글과 속성이 선택기와 일치하는 메시지 만받습니다. 메시지 머리글 및 메시지 속성을 참조하십시오. 메시지 선택자는 메시지 본문의 내용 인 을 기반으로 메시지를 선택할 수 없습니다.

당신은 페이로드 메시지를 찾아 확인을보고 다음이 그러나 더 긴 솔루션 및 검색, 필터링 및 다음 메시지를 읽는 필요합니다, 조건에 따라 메시지를 처리보고 다음 할 수 있습니다. 이것은 성 가시다.

+0

청취자가 xml 파일을 읽고 구문 분석 할 방법이 있습니까? –

+0

청취자는 페이로드가 중요하지 않은 메시지를 읽고 구문 분석합니다. 그런 다음 리스너 코드의 로직에서 라우트해야합니다. –

+0

리스너 코드의 로직에서 단계를 전달하는 방법을 제공 할 수 있습니까? –

관련 문제