ActiveMQ obtenir tous les messages de la file d'attente
Je veux créer un outil qui sera capable de gérer les messages dans la file d'attente. Donc, je tiens à être en mesure d'obtenir tous les messages de la file d'attente(quelque chose comme à l'exportation) et de ne pas l'enlever de là.
J'ai essayé d'utiliser l'API JMX:
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());
Mais je ne peux pas obtenir plus de 400 messages.
Aussi j'ai utilisé une telle approche:
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);
}
mais messagesInQueue.hasMoreElements() renvoie toujours false malgré la file d'attente contient de nombreux messages.
Aussi, si j'essaie d'utiliser consommateur, il récupère tous les messages, mais il l'enlève de la file d'attente.
J'ai essayé d'exporter les messages de la file d'attente à l'aide outil de ligne de commande:
activemq browse --amqurl tcp://localhost:55901 tmp_queue2 >> messages22222.txt
Mais si la file d'attente contient environ 1000000 de messages qu'il jette
Failed to execute main task. Reason: java.lang.OutOfMemoryError: GC overhead limit exceeded
Alors, comment puis-je obtenir tous les messages de la file d'attente et de ne pas les supprimer à partir de là?
merci, j'ai oublié de démarrer la connexion. Quand je l'ai commencé j'ai pu lire à propos de 5000 messages de la file d'attente, mais ensuite Il s'est arrêté pendant une longue période lors de l'extraction de l'élément suivant....
OriginalL'auteur evgeniy44 | 2013-11-27
Vous devez vous connecter pour publier un commentaire.
La File d'attente JMS navigateur ne fait pas de guaruntee qu'il sera de retour à chaque message dans la File d'attente. Il fournit un instantané des Messages mais ne peut pas donner à tous. Dans le cas de ActiveMQ il y a des limites sur le nombre de messages qu'il va parcourir afin de réduire les frais généraux. Vous pouvez augmenter les limites, voir maxBrowsePageSize, cependant il n'y a encore aucun moyen de s'assurer que, pour une grande profondeur de File d'attente, vous obtiendrez tous.
Une meilleure option serait d'utiliser un Chameau route qui envoie des messages ciblés à certains de File d'attente dans une autre File d'attente des processus et un miroir de la File d'attente que vous pouvez vider en utilisant le standard JMS consommateurs ou un autre Chameau route. De cette façon, vous pouvez consommer le miroir des messages à votre propre rythme.
OriginalL'auteur Tim Bish
messagesInQueue.hasMoreElements() renvoie toujours false, car vous devez appeler
avant de réitérer la file d'attente.
OriginalL'auteur Andrea Bozzetto