0

我想测试我的 jms 监听器在发送 5 条消息时是否正常工作(例如)我添加了一个计时器“Threat.sleep(5000)”,5 秒后我想将旧的 messageID 与新的 messageID 进行比较,这意味着我想要知道消息是否被收听,如果 ID 发生变化,这意味着它们被成功收听

这是我的 OnMessage 代码......但它对我不起作用:((

public class Consumer implements MessageListener{

public Consumer() {
}

//@Override
public void onMessage(Message message) {


    try {

         TextMessage tm = (TextMessage) message;

        int i;
        TextMessage tm2 =tm;
                            for(i=0;i<1;i++)
                            {

        try {
            Thread.sleep(5000);

            if (!tm.getJMSMessageID().equals(tm2.getJMSMessageID()))
            { 
                System.out.println("\t----Listener not working----");
            }
            else {

            System.out.println("Message reçu:");
            System.out.println("\tTemps:       " + System.currentTimeMillis() + " ms");
            System.out.println("\tMessage ID: " + tm.getJMSMessageID());
            System.out.println("\tCorrel. ID: " + tm.getJMSCorrelationID());
            System.out.println("\tConsumed message:   " + tm.getText());
                            System.out.println("\t----Listener working----");
            }
            //fin else
        } 
        catch (InterruptedException ex) {
            Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
        }
                            }

    } 
    catch (JMSException jex) {
        System.out.println("Exception: " + jex);
    }
}

}

4

1 回答 1

1

因此,您正在检查 JMS 消息 ID 以确保没有两条消息具有相同的 ID?这可能是矫枉过正,因为如果你的听众正在接收消息,它正在工作!......尽管如此,你的方法有一些问题......

  TextMessage tm = (TextMessage) message;
  ...     
  TextMessage tm2 =tm;
  Thread.sleep(5000);
  if (!tm.getJMSMessageID().equals(tm2.getJMSMessageID()))

以上if()将始终是错误的,因为您正在比较相同的消息;此外,该sleep()声明是无用的。

如果您想比较消息 id 以确保它们始终是唯一的,尽管如果代理无法传递消息,则将重新传递相同的消息并且 id 将是相同的,但无论如何,您可以使用它来替代您的代码..

private static ConcurrentHashMap<String,String> mesgIdMap = 
  new ConcurrentHashMap<String, String>();

public Consumer() {
}

//@Override
public void onMessage(Message message) {
    try {
        TextMessage tm = (TextMessage) message;

        if( mesgIdMap.contains( tm.getJMSMessageID()))
           System.out.println("\tProcessing JMS message with same ID again!");

        //add the message id to the map
        mesgIdMap.put( tm.getJMSMessageID(),tm.getJMSMessageID());
        //print statements here...
于 2013-06-29T03:38:36.483 回答