큐 안에있는 메시지를 관리 할 수있는 도구를 만들고 싶습니다. 그래서 대기열 (수출과 같은 것)에서 모든 메시지를 가져올 수 있기를 원하며 거기에서 메시지를 제거하지 마십시오. 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
그래서, 모든 메시지가 형성 얻을 수있는 방법을 던졌습니다 대기열을 제거하고 거기에서 그들을 제거하지 않습니까?
메시지가 전달되지 않으면 먼저 연결을 시작해야합니다. 브라우저에서 메시지를 반복하거나 브라우저 객체를 생성하기 전에 connection.start()를 호출하십시오. JMS 사양은 메시지를 사용하기 전에 연결 시작이 필요하다고 말합니다. 브라우징이 어떻게 작동해야하는지에 대한 정보는 없지만 브라우징은 일반적인 활동이 아니므로 ActiveMQ가 자체적으로 구현했습니다. – Matej
@Matej, 감사합니다. 연결을 시작하는 것을 잊었습니다. 시작했을 때 대기열에서 약 5000 개의 메시지를 읽을 수 있었지만 다음 요소를 검색하는 동안 오랜 시간 동안 중단되었습니다 .... – evgeniy44