2013-05-10 9 views
7

Stworzyłem AQ w Oracle i napisałem 2 JMS konsumentów w Javie, aby wysłuchać kolejki. Czasami zauważyłem, że jeśli wyprodukuję wiadomość do kolejki; liczba usuniętych wiadomości z kolejki jest większa niż liczba zakolejkowanych. Oznacza to, że niektóre wiadomości są zużywane dwa razy.Oracle AQ ta sama wiadomość jest dostarczana dwa razy:

Stworzyłem kolejkę z własności: - multiple_consumers => FALSE

A konsumenci JMS pracują w CLIENT_ACKNOWLEDGE mode

proszę mi pomóc dowiedzieć się możliwe przyczyny takiego zachowania i to rozwiązanie. Tak, że mogę replikować problem i rozwiązać powyższy problem i upewnić się, że liczba zakolejkowanych wiadomości jest równa liczbie usuniętych wiadomości w przypadku wielu klientów JMS słuchających tego samego AQ.

Odpowiedz

3

Nie widząc swojego kodu, CLIENT_ACKNOWLEDGE zwykle mówi, że wysyłasz potwierdzenia ręcznie. Jeśli nie wyślesz potwierdzenia, wiadomość nie zostanie usunięta, a broker spróbuje ponownie dostarczyć ją na późniejszym etapie (np. Po ponownym uruchomieniu połączenia lub podobnym). To może być przyczyną twojego niepokoju.

+0

W rzeczywistości proces jest podobny do tego, jak Konsument zużywa wiadomość, rejestruje ją w tabeli bazy danych i wysyła potwierdzenie ACK. jeśli istnieje jakiś wyjątek podczas przetwarzania, to wiadomość jest przenoszona do kolejki wyjątków. Utworzyłem wielu klientów JMS, ponieważ jeśli jeden jest wyłączony, inni mogą przetwarzać komunikaty, np. aby zapewnić sprawną pracę systemu i wysoką dostępność. Zapewnia to w takim scenariuszu, w którym ACK nie jest wykonywane lub generowany jest wyjątek, komunikat jest pobierany jeden raz. –

+0

OK. Jest to jednak jeden z najbardziej prawdopodobnych powodów (że potwierdzenie nie zostało wysłane). Nie jestem zaznajomiony z licznikiem usuwającym kolejki i sposobem, w jaki oblicza on paczki (tj. Jest niepotrzebną, ale wysłaną wiadomością wycofaną, czy nie, a co z wycofaną transakcją itp.). Dodaj próbki kodu i więcej informacji w swoim Q, aby uzyskać lepsze odpowiedzi. –

+0

Właściwie uruchomiłem takie scenariusze testowe, w których policzyłem numer zaksięgowanej wiadomości i liczbę usuniętych wiadomości, a prawdopodobieństwo wystąpienia takiego scenariusza jest bardzo rzadkie. Właściwie to tak, jakbym wydłubał 15K wiadomości i zgasił go, i uruchomiłem ten test 20-30 razy i tylko dwa razy lub trzykrotnie zauważyłem, że liczba odciśniętych jest większa niż liczba zakolejkowanych. –