2013-11-27 25 views
5

Kuyruktaki iletileri yönetebilecek bir araç oluşturmak istiyorum. Bu yüzden kuyruktaki tüm iletileri (ihracat gibi bir şey) elde edebilmek ve oradan kaldırmamak istiyorum. ActiveMQ kuyruktan tüm iletileri al

Ben JMX API kullanmaya çalıştı:

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()); 

Ama 400'den fazla mesaj alınamıyor.

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); 
    } 

ama her zaman kuyrukta rağmen false döndüren() messagesInQueue.hasMoreElements içeren çok mesaj:

Ayrıca böyle bir yaklaşım kullanılır.

Ayrıca, tüketiciyi kullanmaya çalışırsam, tüm iletileri alır, ancak sıradan kaldırır.

Ben komut satırı aracını kullanarak sıradan iletileri ihraç etmeye çalıştı:

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

Ama kuyruk yaklaşık 1000000 mesajlar içeriyorsa o

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

Yani, tüm iletiler oluşturan alabilirim nasıl atar sıra ve onları oradan kaldırmayın mı?

+1

İleti gönderilmediğinde, önce bağlantıyı başlatmanız gerekir. İletileri tarayıcıdan yinelemeden veya tarayıcı nesnesini oluşturmadan önce connect.start() öğesini çağırın. JMS belirtimi, mesajların tüketilmesinden önce bağlantı başlangıcının gerekli olduğunu, tarama işleminin nasıl çalışması gerektiğine dair bir açıklama yapılmadığını, ancak tarama işleminin bu kadar yaygın bir etkinlik olmadığı için ActiveMQ'nun muhtemelen kendisi tarafından uygulandığını söylüyor. – Matej

+0

@Matej, teşekkürler, bağlantıyı başlatmayı unuttum. Başladığımda kuyruktan yaklaşık 5000 mesaj okuyabiliyordum ama sonra bir sonraki öğeyi alırken uzun bir süre durdu .... – evgeniy44

cevap

6

JMS Kuyruğu tarayıcısı, Kuyruktaki her iletiyi döndüreceği konusunda hiçbir garanti vermez. Mesajların bir anlık görüntüsünü sağlar, ancak hepsini vermeyebilir. ActiveMQ durumunda, ek yükü azaltmak için kaç mesajın göz atacağı konusunda limitler vardır. Limitleri artırabilir, maxBrowsePageSize konusuna bakın, ancak çok derin bir Kuyruk için hepsini alacağınızdan emin olmanın hiçbir yolu yoktur.

Daha iyi bir seçenek, bazı Kuyrukta hedeflenen iletileri başka bir işlem Kuyruğuna ve standart JMS tüketicilerini veya başka bir Camel yolunu kullanarak drenaj yapabileceğiniz bir ayna Kuyruğuna gönderen bir Deve rotası kullanmak olabilir. Bu şekilde, yansıtılan mesajları kendi hızınızda tüketebilirsiniz. kuyruğunu yineleme önce

connection.start(); 

çağırmalıdır nedeniyle bu derste

+1

ayna sıraları sorunu çözmem için iyi bir yoldur, teşekkürler! – evgeniy44

0

messagesInQueue.hasMoreElements() her zaman false döndürür.

İlgili konular