2011-08-16 12 views
0

JMSが初めてです。私の質問が意味をなさない場合は、私を修正してください。 オブジェクトを送信するためにjmsを使用するプログラムを記述しています。しかし私のプログラムでは、私が時々送るオブジェクトの数は変化しています。だから私は受信側でカウントダウンを使用することはできません。また、私は多くを検索しましたが、JMSキューの長さを知る方法を見つけることができませんでした。 私はどのように私はすべてのオブジェクトが消費されるまで私のキューを読むことができます方法を教えてください。以下 カウントダウンなしでJMS Recieverを書くことは可能ですか?

は私のコードで、私はこれを行うには直接的な方法はありません知っているとして、それは限りキュー

public class QReciever{ 

private static QueueConnection qConn; 
private static QueueSession qSession; 
private static Queue que; 

private static BuildInfo recieveBuildInfo; 


///INner Class 

public static class ExListener implements MessageListener{ 
    public void onMessage(Message msg){ 
     System.out.println("IN side onMessage method in Inner class"); 
     try { 
      ObjectMessage objMsg = (ObjectMessage) msg; 
      setRecieveBuildInfo((BuildInfo)objMsg.getObject()); 
      System.out.println("############################ Inside the Inner class\n\t Build No is: "+getRecieveBuildInfo().getBuildNo()); 
      write2Db(getRecieveBuildInfo()); 

     } catch (JMSException e) { 
      e.printStackTrace(); 
     } 
    } 
} 



public static BuildInfo getRecieveBuildInfo() { 
    return recieveBuildInfo; 
} 
public static void setRecieveBuildInfo(BuildInfo recieveBuildInfo) { 
    QReciever.recieveBuildInfo = recieveBuildInfo; 
} 



public static void recieveQueue() throws Exception{ 
    System.out.println("############################Inside recieveQueue"); //#################################################################### 

//Jndi lookup 
    Properties props = ProptManager.getProperties(); 

    InitialContext initCtx = new InitialContext(props); 
    Object temp = initCtx.lookup("XAConnectionFactory"); 
    QueueConnectionFactory qcf = (QueueConnectionFactory) temp; 
    qConn = qcf.createQueueConnection(); 
    qConn.start(); 
    que = (Queue) initCtx.lookup("queue/MyQueue"); 
    qSession = qConn.createQueueSession(false, qSession.AUTO_ACKNOWLEDGE); 
    QueueReceiver qReciever = qSession.createReceiver(que); 

    qReciever.setMessageListener(new ExListener()); 



    qReciever.close(); 
    System.out.println("qReciever Closed"); 
    qSession.close(); 
    System.out.println("qSession Closed"); 
    qConn.close(); 
    System.out.println("qConn Closed"); 
    //System.exit(1); 
} 

public static void write2Db(BuildInfo bInfo){ 
    System.out.println("############################ Inside write2Db "); 
       //writing to the database 
    }catch(Exception e){ 
     System.out.println("Error: Updating Database, The record which the Build No is: "+bInfo.getBuildNo()+" may already inserted" + e.getMessage()); 

    } 
} 
+0

QueueRecieverの部分を に置き換えました。{ MessageConsumer consumer = qSession.createConsumer(que); consumer.setMessageListener(新しいExListener()); 今、メッセージを消費しますが、まだすべてのキュー要素が消費されているかどうかを直接知ることはできません。 plz someone me me } – Isuru

答えて

0

の最初のオブジェクトだけを読み取ります。しかし、これを行う方法は2つ(おそらくもっと..)あります。私はあなたのことをよく理解していれば、毎日、または1時間ごとにデータを短時間送信します。私の「解決策」は、あなたが継続的に送信するとうまくいかない。

JMS実装に応じて何ができますか(特定のことをしたい場合):JMX(JMSプロバイダが提供している場合はSonicMQなど)を使用して、キュー内のその他のメッセージ

また、別のキューブローサーを作成して、他のメッセージがあるかどうかを調べることもできます。

あなたのユースケースに関する情報を追加することができます。そのキューにさらにメッセージがあるかどうかを知る必要があるのはなぜか分かります。

私はQueueBrowserが最も簡単なことだと思っていますが、それはエレガントで効率的ではないと思います。あなたは別の解決策を見つけたいかもしれません。

これが役に立ちます。

0

あなたの最善の選択肢は、使用しているJMSキューに別のプロトコルを追加することです。

単一のプロデューサと1つのコンシューマがある場合、プロデューサに最初に送信しようとしているメッセージの総数を含むヘッダーメッセージを送信させることができます。これにより、カウントを表示して欠落したメッセージを検出することができます。

しかし、これはキューをうまく使っているとは思えません。キューを使用すると、一般に各メッセージが独立したものになります。どのくらいの数のメッセージが到着したのかは、単一のメッセージをできるだけ盲目的に扱うだけで、消費者にとって重要なことではありません。

0

最後のメッセージにブール値のプロパティを設定するだけで、完了したことを示すことができます。

関連する問題