2013-05-10 9 views
7

Ich erstellte eine AQ in Oracle und schrieb 2 JMS-Consumer in Java, um die Warteschlange zu hören. Ich habe manchmal beobachtet, dass, wenn ich eine Nachricht in Warteschlange stellen; Die Anzahl der aus der Warteschlange entfernten Nachrichten ist größer als die der Warteschlange. Es bedeutet, dass einige Nachrichten zweimal verbraucht werden.Oracle AQ dieselbe Nachricht wird zweimal geliefert

Ich habe Warteschlange mit Eigentum erstellt: - multiple_consumers => FALSE

Und JMS Verbraucher arbeiten in CLIENT_ACKNOWLEDGE mode

Bitte helfen Sie mir die möglichen Gründe für ein solches Verhalten zu lernen und es ist Lösung. So kann ich das Problem replizieren und das obige Problem lösen und sicherstellen, dass die Anzahl der in die Warteschlange eingereihten Nachrichten der Anzahl der aus der Warteschlange entnommenen Nachrichten entspricht, wenn mehrere JMS-Benutzer denselben AQ hören.

Antwort

3

Ohne Ihren Code zu sehen, sagt CLIENT_ACKNOWLEDGE normalerweise, dass Sie Bestätigungen manuell senden. Wenn Sie keine Bestätigung senden, wird die Nachricht nicht gelöscht und der Broker wird versuchen, sie zu einem späteren Zeitpunkt (z. B. beim Neustart der Verbindung oder ähnlichem) erneut zuzustellen. Dies könnte der Grund für Ihre Bedenken sein.

+0

Eigentlich ist der Prozess wie Consumer konsumiert die Nachricht, protokolliert es in der Datenbanktabelle und sendet ACK. Wenn bei der Verarbeitung eine Ausnahme auftritt, wird diese Nachricht in die Ausnahmeschlange verschoben. Ich habe mehrere JMS-Consumer erstellt, weil, wenn einer aus ist, andere die Nachrichten verarbeiten können, d. um sicherzustellen, dass das System effizient arbeitet und eine hohe Verfügbarkeit besteht. So stellt dies in einem solchen Szenario sicher, in dem ACK nicht ausgeführt wird oder Ausnahme generiert wird Nachricht wird einmal verbraucht. –

+0

Okay. Aber das ist einer der wahrscheinlichsten Gründe überhaupt (dass ein Ack nicht gesendet wurde). Ich bin nicht mit dem Dequeue-Counter vertraut und weiß, wie er Dequeues berechnet (d. H. Ist eine nicht gepackte, aber gesendete Nachricht, die aus der Warteschlange genommen wird oder nicht, was ist mit einer zurückgesetzten Transaktion usw.). Fügen Sie Codebeispiele und weitere Informationen in Ihr Q für bessere Antworten hinzu. –

+0

Eigentlich habe ich solche Testszenarien ausgeführt, in denen ich die Anzahl der eingereihten Nachrichten und die Anzahl der ausgekoppelten Nachrichten gezählt habe und die Wahrscheinlichkeit, ein solches Szenario zu bekommen, ist sehr selten. Tatsächlich ist es so, als ob ich 15K-Nachrichten in die Warteschlange gestellt und aus der Warteschlange genommen hätte, und ich habe diesen Test etwa 20-30 mal durchgeführt und nur zweimal oder dreimal habe ich beobachtet, dass die Anzahl der ausgetragenen Spiele größer ist als die Anzahl der eingereihten. –

Verwandte Themen