2016-03-24 3 views
2

メッセージIDセレクタを使用してJMS経由でTibco EMSブローカからメッセージを消費しようとしています。メッセージがNON_PERSISTENTの場合は、JMSMessageIDによってメッセージを選択でき、すべて正常に動作します。Tibco EMS上の永続メッセージをJava(JMS)のセレクタで消費しようとする問題

メッセージがPERSISTENTの場合、セレクタは何も取得しません。 Apache ActiveMQで同じコードを試しましたが、どちらの場合でも動作します。私はEMSのサンプルを見てきましたが、明らかなものは何も見えません。これに影響する可能性のあるEMS設定があるかどうかわかりません...

セレクタを省略すると、DeliveryModeに関係なくメッセージが正しく消費されます。

私はこれを再現するために使用しています。

すべてのヘルプははるかに高く評価されるだろう:)

package com; 

import javax.jms.*; 
import com.tibco.tibjms.TibjmsConnectionFactory; 

public class JMSTest { 
    String msgIdPersistent = ""; 
    String msgIdNon_Persistent = ""; 
    String serverUrl = "tcp://localhost:7222"; 
    String queueName = "test"; 

    public static void main(String[] args) { 
     JMSTest test = new JMSTest(); 
     try { 
      test.publish(); 
      test.deleteBySelector(); 
     }catch(Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public void deleteBySelector() throws Exception { 
     // Create connection and session 
     ConnectionFactory factory = new TibjmsConnectionFactory(serverUrl); 
     Connection connection = factory.createConnection(); 
     connection.start(); 
     Session session = connection.createSession(); 

     // Delete non-persistent 
     // 
     String selectorNonPersist = "JMSMessageID='" + msgIdNon_Persistent + "'"; 
     MessageConsumer nonPersistReceiver = session.createConsumer(session.createQueue(queueName), selectorNonPersist); 
     Message nonPersistMsg = null; 
     nonPersistMsg = nonPersistReceiver.receive(1000); 
     System.out.println("NON PERSISTENT SELECTOR: " + ((nonPersistMsg!=null) ? "SUCCESS" : "FAIL")); 

     // Delete Persistent - **** THIS DOESN'T WORK ***** 
     // 
     String selectorPersist = "JMSMessageID='" + msgIdPersistent + "'"; 
     MessageConsumer persistReceiver = session.createConsumer(session.createQueue(queueName), selectorPersist); 
     Message persistMsg = null; 
     persistMsg = persistReceiver.receive(1000); 
     System.out.println("PERSISTENT SELECTOR: " + ((persistMsg!=null) ? "SUCCESS" : "FAIL")); 
    } 

    public void publish() throws Exception { 
     ConnectionFactory factory = new com.tibco.tibjms.TibjmsConnectionFactory(serverUrl); 
     Connection connection = factory.createConnection(); 
     connection.start(); 
     Session session = connection.createSession(javax.jms.Session.AUTO_ACKNOWLEDGE); 
     Destination destination = session.createQueue("test"); 

     // Send persistent message 
     // 
     System.out.println("Persistent publish"); 
     MessageProducer producerPersistent = session.createProducer(null); 
     producerPersistent.setDeliveryMode(DeliveryMode.PERSISTENT); 
     TextMessage messagePersistent = session.createTextMessage("PERSISTENT"); 
     producerPersistent.send(destination, messagePersistent); 
     msgIdPersistent = messagePersistent.getJMSMessageID(); 
     System.out.println("\tMsgId=" + msgIdPersistent); 

     // Send Non Persistent message 
     // 
     System.out.println("NON Persistent publish"); 
     MessageProducer producernonPersistent = session.createProducer(destination); 
     producernonPersistent.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 
     TextMessage messageNonPersistent = session.createTextMessage("NON_PERSISTENT"); 
     producernonPersistent.send(messageNonPersistent); 
     msgIdNon_Persistent = messageNonPersistent.getJMSMessageID(); 
     System.out.println("\tMsgId=" + msgIdNon_Persistent); 

     // Clean up 
     session.close(); 
     connection.close(); 

     System.out.println("Done publish\n"); 
    } 
} 

私はこれから取得しています出力は、次のとおりです。私は8.2.x.でそのバグを確認しました

Persistent publish 
     MsgId=ID:EMS-SERVER.3D856ECE827932:1 
    NON Persistent publish 
     MsgId=ID:EMS-SERVER.3D856ECE827932:2 
    Done publish 

    NON PERSISTENT SELECTOR: SUCCESS 
    PERSISTENT SELECTOR: FAIL 
+0

Tibco EMS 8.xを使用していますか?私は同じ行動を見ている。それはバグに見えます。あなたはこれを解決する運を持っていましたか? –

+0

はい、EMS 8.2を使用しています。まだこれを解決する運がなかった。私は同じコアコードを使用して複数のJMSブローカのタイプをブラウズしています。 EMSは私がこの問題を見ている唯一のブローカーです。 8.3が出て、それを試してみる.... –

答えて

1

私は8.3.xにアップグレードし、正常に動作しています。

関連する問題