1

次のコード ブロックを使用して、JMS メッセージをキューにポストし、応答キューで応答メッセージを取得しています。(次のコードは、スレッドごとに 20 個のバッチで 100 個のメッセージに対して実行され、5 つのスレッドが同時に実行されます)

    for(int i=0;i<=20;i++)
            {
                msg=myMessages.get(i); // myMessages is an array of TextMessages 
                qsender = qsession.createSender((Queue)msg.getJMSDestination());
                qreceiver=qsession.createReceiver((Queue)msg.getJMSDestination());

                tempq = qsession.createTemporaryQueue();
                responseConsumer = qsession.createConsumer(tempq);
                msg.setJMSReplyTo(tempq);
                responseConsumer.setMessageListener(new Listener());

                msg.setJMSCorrelationID(msg.getJMSCorrelationID()+i);
                qsender.send(msg);   
            }

リスナーの実装:

public class Listener 
implements MessageListener
{
    public void onMessage(Message msg)
    {
        TextMessage tm = (TextMessage) msg;
        // to calculate the response time

    }
}

要件は、各メッセージにかかる応答時間を取得して保存することです。どうすればいいですか?メッセージのプロパティで時刻/日付を設定し、相関 ID を使用してリスナーで時刻を計算することを考えています。

それについて別の方法はありますか?

4

1 に答える 1

1

Map<String, Long>CorrelationID を送信時刻にマップし、リスナーから検索することができます。これが機能するには、応答を送信するプロセスが応答メッセージに正しい CorrelationID を配置する必要があります。

この例では、 が であり、それが送信側と応答リスナーの両方の範囲内にtimemapあるMap<String, Long>と想定しています (それをどのように達成するかはあなた次第です)。

上からのループ本体、変更:

            msg=myMessages.get(i); // myMessages is an array of TextMessages 
            qsender = qsession.createSender((Queue)msg.getJMSDestination());
            qreceiver=qsession.createReceiver((Queue)msg.getJMSDestination());

            tempq = qsession.createTemporaryQueue();
            responseConsumer = qsession.createConsumer(tempq);
            msg.setJMSReplyTo(tempq);
            responseConsumer.setMessageListener(new Listener());

            msg.setJMSCorrelationID(msg.getJMSCorrelationID()+i);
            /* MODIFICATIONS */  
            synchronzied(timemap){
               timemap.put(msg.getJMSCorrelationID(), System.currentTimeMillis());
            } /* END MODIFICATIONS */
            qsender.send(msg);

あなたのリスナー、変更:

public void onMessage(Message msg)
{
    TextMessage tm = (TextMessage) msg;
    long now = System.currentTimeMillis();
    long responseTime = 0;
    synchronized(timemap){
         Long sent = timemap.get(msg.getJMSCorrelationID());
         if(sent != null){
             /* Store this value, this is the response time in milliseconds */
             responseTime = now - sent; 
         }else{
             /* Error condition. */
         }
    }

}
于 2012-08-14T02:22:10.027 に答える