2013-11-27 3 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); 
    } 

하지만 항상 큐에도 불구하고 false를 반환() messagesInQueue.hasMoreElements에 포함 된 많은 메시지 :

또한 나는 그런 접근 방식을 사용했다.

또한 소비자를 사용하려고 시도하면 모든 메시지가 검색되지만 큐에서 제거됩니다.

나는 명령 줄 도구를 사용하여 큐에서 메시지를 내보내려고 :

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

그러나 큐에 대한 1000000 메시지가있는 경우는

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

그래서, 모든 메시지가 형성 얻을 수있는 방법을 던졌습니다 대기열을 제거하고 거기에서 그들을 제거하지 않습니까?

+1

메시지가 전달되지 않으면 먼저 연결을 시작해야합니다. 브라우저에서 메시지를 반복하거나 브라우저 객체를 생성하기 전에 connection.start()를 호출하십시오. JMS 사양은 메시지를 사용하기 전에 연결 시작이 필요하다고 말합니다. 브라우징이 어떻게 작동해야하는지에 대한 정보는 없지만 브라우징은 일반적인 활동이 아니므로 ActiveMQ가 자체적으로 구현했습니다. – Matej

+0

@Matej, 감사합니다. 연결을 시작하는 것을 잊었습니다. 시작했을 때 대기열에서 약 5000 개의 메시지를 읽을 수 있었지만 다음 요소를 검색하는 동안 오랜 시간 동안 중단되었습니다 .... – evgeniy44

답변

6

JMS 대기열 브라우저는 대기열에있는 모든 메시지를 리턴한다는 guaruntee를 작성하지 않습니다. 그것은 메시지의 스냅 샷을 제공하지만 그것들 모두를 제공하지는 못할 수도 있습니다. ActiveMQ의 경우 오버 헤드를 줄이기 위해 검색 할 메시지 수에 제한이 있습니다. 한계를 늘릴 수는 있지만 maxBrowsePageSize를 참조하십시오. 그러나 여전히 매우 깊은 대기열에 대해서는 모든 것을 얻을 수있는 방법이 없습니다.

더 나은 옵션은 다른 대기열 및 표준 JMS 사용자 또는 다른 Camel 경로를 사용하여 유출 할 수있는 미러 대기열에 일부 대기열을 대상으로하는 메시지를 보내는 Camel 경로를 사용하는 것입니다. 이렇게하면 자신의 페이스대로 미러 된 메시지를 소비 할 수 있습니다. 큐를 반복하기 전에

connection.start(); 

를 호출해야합니다 렸기 때문에

+1

미러 대기열이 내 문제를 해결하는 좋은 방법입니다. 감사합니다. – evgeniy44

0

messagesInQueue.hasMoreElements()는 항상 false를 반환합니다.

관련 문제