2016-08-31 36 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> 

Javaコード:

ます。public void 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プロバイダにフィルタリングする作業。メッセージセレクタを使用するアプリケーション の例については、 セッションBeanでJMS APIを使用するアプリケーションを参照してください。

メッセージセレクタは、式を含むStringです。この式の構文 は、SQL92条件付き 式構文のサブセットに基づいています。例のメッセージセレクタは、「スポーツ」 または「意見」の値に設定されているNewsType性を有する任意 メッセージを選択:

NewsType =「スポーツ」OR NewsType =「意見」createConsumerと のcreateDurableSubscriberメソッドを使用すると、メッセージコンシューマを作成するときに、メッセージ セレクタを引数として指定できます。

メッセージコンシューマは、ヘッダーと のプロパティがセレクタに一致するメッセージのみを受信します。 (メッセージヘッダーとメッセージ プロパティを参照してください。)メッセージセレクタは、メッセージ本文の内容を に基づいて選択することはできません。

あなたはその後、ペイロードを確認し、メッセージをブラウズを見て、その後、条件に基づいてメッセージを処理して見たいことがあり、これはしかし長くソリューションであり、ブラウジングが必要になり、フィルタリングして、メッセージを読みます。これは面倒です。

+0

リスナーがxmlファイルを読み込んで解析する方法はありますか? –

+0

リスナーはペイロードの重要でないメッセージを読み取り、解析します。リスナー・コードのロジックからルーティングする必要があります。 –

+0

リスナー・コードのロジックからステップをどのようにルーティングするかを指定できます。 –

関連する問題