Zdaję sobie sprawę, że przychodzę do tej dyskusji nieco późno i prawdopodobnie już zakodowałeś tę aplikację. Jeśli kiedykolwiek będziesz musiał go zmodyfikować lub dla kogokolwiek, kto może potrzebować czegoś podobnego, mam kilka obserwacji.
Po pierwsze, jeśli można to zrobić z klientem WMM v7 QMgr i v7, byłoby to preferowane rozwiązanie. W wersji 7 obsługa .Net została przeniesiona z SupportPac do części produktu podstawowego. Istnieje znaczna nowa funkcjonalność, niektóre poprawki błędów i lepsza wydajność. Również na v7 możesz użyć pub-sub ..., który doprowadza mnie do mojej drugiej obserwacji.
Na podstawie opisu w oryginalnym poście, zrobiłbym to w Pub-Sub. Aplikacja, która umieszcza komunikat, potrzebuje tylko jednego i nie musi nawet wiedzieć, że chodzi o temat. Można rzeczywiście umieścić alias na temat, który sprawia, że wygląda on jak kolejka do producenta wiadomości. Twoje konsumujące aplikacje mogą następnie subskrybować lub możesz zrobić dwie subskrypcje administracyjne, tak aby opublikowane wiadomości trafiały do dwóch ustawionych kolejek. Twoje aplikacje mają wtedy dedykowaną kolejkę i nie ma żadnych zmian w kodowaniu dla producenta i aplikacji wsadowej, to tylko konfiguracja. Oczywiście aplikacja sterująca transakcjami musi raczej konsumować wiadomości niż je przeglądać.
Tutejsze zalety są różnorakie:
- Ponieważ kolejka wypełnia się z wiadomości, indeksowanie zostaje przepłukany na dysku i powyżej progu zobaczysz spadek wydajności, które mogą być znaczące. Dlatego obecna metoda nie skaluje się tak dobrze.
- Za pomocą metody pub-sub można mieć wiele instancji aplikacji czasu rzeczywistego lub aplikacji wsadowych lub obu, a te mogą być na tym samym lub innym QMgr. Skalowanie jest łatwe.
- Eliminujesz zależność między aplikacjami w czasie rzeczywistym i aplikacjami wsadowymi, które muszą być na tym samym QMgr.
- Bardziej przejrzysta administracja. Jeśli widzisz wiadomości budowane w kolejce w czasie rzeczywistym, wiesz, że masz problem.
Kilka zupełnie różnych zagadnień również tutaj. Jedną z nich jest użycie opcji Fail if Quiescing. Celem tego jest to, że gdy QMgr zostanie całkowicie zamknięty, ta opcja powoduje, że twoje wywołanie API kończy się z kodem zwrotnym wskazującym, że QMgr jest wyłączany. Jeśli nie uwzględnisz tej opcji, możliwe jest, że w przypadku dwóch lub więcej połączonych aplikacji QMgr będzie się wyłączał w sposób czysty i trzeba go będzie wymusić, lub jeśli jego procesy zostaną zabite za pomocą brutalnej siły. Z reguły zawsze używaj polecenia "Fail", jeśli wypisujesz wszystkie wywołania API, które go obsługują. Powodem, dla którego w ogóle istnieje, jest dla ludzi, którzy potrzebują transakcji XA, ale z jakiegoś powodu nie mogą z niego korzystać. W tym scenariuszu połączenie CONNECT i pierwsze wywołanie GET lub PUT używa parametru Fail, jeśli ustawienie Quiescing jest ustawione, a kolejne operacje GET lub PUT nie. Powoduje to, że QMgr oczekuje na zakończenie całego zestawu wywołań GET/PUT, ale następny CONNECT lub GET/PUT używa Fail, jeśli Quiescing, więc QMgr ma szansę na wyłączenie, jeśli to konieczne.
Inną obserwacją tutaj jest to, że tutaj nie ma tu Złodzieja. Zgaduję, że jest jeszcze jeden w zasięgu stosu połączeń? Zawsze zaleca się wydrukowanie kodu powrotu WMQ z wyjątku, aby można było znaleźć przyczynę. W przypadku zadań konsultingowych zawsze doradzam klientom, że niepowodzenie drukowania kodu powrotu (lub powiązany wyjątek dla kodu JMS/XMS) jest elementem showstopper, który powinien uniemożliwić promowanie aplikacji do Produkcji. To naprawdę takie ważne. Nawet jeśli złapiesz kod, który wywołuje metodę getMessage(), ktoś wykorzystujący przykładowy fragment kodu może nie zdawać sobie sprawy z tego, że brakuje tego ważnego elementu.
+1 - Żałuję, że nie odkryłem tego pytania, zanim musiałem sam się o tym przekonać. –