2013-11-27 33 views
5

キュー内のメッセージを管理できるツールをいくつか作成します。だから、私はキューからすべてのメッセージを取得することができます(エクスポートのようなもの)、そこからそれを削除しないでください。ActiveMQはキューからすべてのメッセージを取得します

私は、JMX APIを使用してみました:

ObjectName mbeanNameQueue = new ObjectName("org.apache.activemq:type=Broker,brokerName=static-broker1,destinationType=Queue,destinationName=tmp_queue2"); 
    org.apache.activemq.broker.jmx.QueueViewMBean queueView = JMX.newMBeanProxy(mbsc, mbeanNameQueue, org.apache.activemq.broker.jmx.QueueViewMBean.class); 
    System.out.println(queueView.browseAsTable()); 

をしかし、私は400件の以上のメッセージを取得することはできません。

はまた、私はこのようなアプローチを使用:

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:55901"); 
    ActiveMQConnection connection = (ActiveMQConnection)connectionFactory.createConnection(); 
    DestinationSource ds = connection.getDestinationSource(); 

    QueueSession queueSession = connection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE); 
    Queue queue = queueSession.createQueue("tmp_queue2"); 
    QueueBrowser browser = queueSession.createBrowser(queue); 
    Enumeration<?> messagesInQueue = browser.getEnumeration(); 

    while (messagesInQueue.hasMoreElements()) { 
     Message queueMessage = (Message) messagesInQueue.nextElement(); 
     System.out.println(queueMessage); 
    } 

しかしmessagesInQueue.hasMoreElements()は常にキュー多くのメッセージが含まれているにもかかわらず、falseを返します。

また、コンシューマを使用しようとすると、すべてのメッセージが取得されますが、キューから削除されます。

私は、コマンドラインツールを使用してキューからメッセージをエクスポートしようとした:

activemq browse --amqurl tcp://localhost:55901 tmp_queue2 >> messages22222.txt 

しかし、キューが、それはそう

Failed to execute main task. Reason: java.lang.OutOfMemoryError: GC overhead limit exceeded 

を投げるについて1000000メッセージが含まれている場合、どのように私はすべてのメッセージフォームを得ることができますキューから削除しないでください。

+1

メッセージが届かない場合は、最初に接続を開始する必要があります。ブラウザからメッセージを繰り返したり、ブラウザオブジェクトを作成したりする前に、connection.start()を呼び出してください。 JMS仕様では、メッセージを消費する前に接続開始が必要であり、ブラウジングの仕組みについては言及していませんが、ブラウジングはあまり一般的ではないため、ActiveMQはおそらくそれ自体で実装しています。 – Matej

+0

@Matej、ありがとう、私は接続を開始するのを忘れました。私はそれを開始したとき、私はキューから約5000のメッセージを読むことができましたが、それは次の要素を取得中に長い間停止しました.... – evgeniy44

答えて

6

JMSキューブラウザでは、キュー内のすべてのメッセージが返されるとは限りません。それはメッセージのスナップショットを提供しますが、それらをすべて与えるわけではありません。 ActiveMQの場合、オーバーヘッドを減らすためにブラウズするメッセージの数に制限があります。限界を増やすことができます。maxBrowsePageSizeを参照してください。しかし、非常に深いQueueの場合、それらをすべて取得する方法はありません。

より良いオプションは、標準のJMSコンシューマまたは別のCamelルートを使用して排除できる、別のプロセスキューとミラーキューにいくつかのキューを対象とするメッセージを送信するCamelルートを使用することです。この方法で、自分のペースでミラーリングされたメッセージを消費することができます。キューを反復する前に、あなたが

connection.start(); 

を呼び出す必要がありますbecouse

+1

ミラーキューは私の問題を解決する良い方法です、ありがとう! – evgeniy44

0

messagesInQueue.hasMoreElements()は常にfalseを返します。

関連する問題