WebSphere MQ - Triggering kolejek i aplikacji

Autor: Marcin Kasiński
26.04.2012 12:59:49 +0200

Triggering aplikacji

Często w przypadku komunikacji MQ aplikacja uruchamiana jest niezależnie od menadżera kolejek, łączy się z nim, czyta jej kolejki, procesuje komunikaty cały oczekując na nowe komunikaty w kolejce wejściowej. Istnieją jednak sytuacje, w których tego typu rozwiązanie można zastąpić bardziej odpowiednim. Wyobraźmy sobie sytuacje, kiedy komunikaty, które aplikacja musi przetworzyć pojawiają się w jej kolejce wejściowej bardzo rzadko. Może się okazać, że aby nie trzymać zasobów niewykorzystywanych, a to ma miejsce np., kiedy aplikacji przez długi czas oczekuje na kolejce na nowe komunikaty bez rezultatu, wskazane by było uruchomienie aplikacji w momencie pojawienia się komunikatu w kolejce. Taka uruchomiona aplikacja może przeczytać dany komunikat z kolejki przetworzyć go i inne znajdujące się w kolejce i rozłączyć się po zaraz po ich przetworzeniu lub po jakimś określonym w aplikacji czasie. Na tym właśnie polega triggering aplikacji.

Zasada działania

Za uruchomienie aplikacji, która ma być triggerowana, czyli uruchamiania w momencie pojawienia się komunikatu w kolejce odpowiada trigger monitor. Trigger Monitor to specjalny proces ( runmqtrm ), którego zadaniem jest czytanie specjalnej kolejki inicjującej w której menadżer kolejek umieszcza komunikaty zdarzenia informujące o tym, iż spełnione zostały warunki do uruchomienia odpowiedniej klienckiej aplikacji. Trigger monitor odczytuje te komunikatu i na podstawie informacji w nich zawartych uruchamia odpowiedni proces aplikacji, która po uruchomieniu czyta komunikatu w jej kolejce wejściowej. Aby włączyć triggering danej aplikacji należy :

  • Kolejkę wejściową aplikacji ustawić jako trigerowaną
  • Utworzyć specjalną kolejkę w której zapisywane będą komunikaty inicjujące aplikację
  • Utworzyć specjalny obiekt MQ reprezentujący aplikację, która będzie uruchamiana przez trigger monitor
  • Uruchomić proces trigger monitora

Określenie kolejki jako triggerowanej

Z pojęciem triggerowania aplikacji związane są następujące atrybuty kolejki:

  • TRIGGERParametr oznacza włączenie triggerowanie danej kolejki
  • TRIGTYPEParametr oznacza sposób triggerowania kolejki

Parametr TRIGTYPE przyjmuje następujące wartości :

  • EVERYAplikacja będzie uruchamiana za każdym razem, kiedy w kolejce pojawi się komunikat
  • FIRSTAplikacja będzie uruchamiana jeśli kolejka będzie pusta i pojawi się w niej nowy komunikat oraz żadna aplikacja nie będzie miała kolejkę otwartą do odczytu. Dodatkowo jeśli po czasie w milisekundach określonych w parametrze
  • TRIGINTmenadżer kolejek nie stwierdzi aby kolejka była otwarta do odczytu nowy komunikat inicjujący zostanie umieszczony w kolejce inicjującej.
  • DEPTHAplikacja zostanie uruchomiona jeśli w kolejce będzie odpowiednia ilość komunikatów. Ilość tą określa parametr

Przykładowo poniższa komenda mqsc tworzy kolejkę QUEUE.IN , która jest triggerowana. Komunikat inicjujący zostanie umieszczony w kolejce inicjującej QUEUE.INIT w momencie kiedy w kolejce będzie 10 komunikatów i nie będzie ona otwarta przez żadną aplikację do czytania. Trigger monitor w momencie pojawienia się zdarzenia ma uruchomić aplikacje opisaną w obiekcie MYAPP_PROCESS .

DEFINE QLOCAL (QUEUE.IN) + 


PROCESS (MYAPP_PROCESS) + 


INITQ (QUEUE.INIT) + 


TRIGGER + 


TRIGTYPE (DEPTH) + TRIGDPTH (10)


Utworzenie kolejki inicjującej

Proces tworzenie kolejki inicjującej nie różni się od tworzenia standardowej kolejki MQ. Zaleca się jedynie, aby triggerowanie działało poprawnie, ustawić tą kolejkę jako nie triggerowaną oraz aby zabronić czytania z niej wielu instancją aplikacji, tj. trigger monitora. Przykładowa komenda tworząca taką kolejkę może mieć postać:

DEFINE QLOCAL(QUEUE.INIT) +


NOSHARE + 


NOTRIGGER


Utworzenie obiektu PROCESS

W celu określenia jaka aplikację trigger monitor ma uruchamiać w momencie pojawienia się komunikatu w kolejce inicjującej należy stworzyć specjalny obiekt PROCESS, którego argumenty to:

  • APPLTYPEokreśla system operacyjny aplikacji, która ma być uruchamiana
  • APPLICIDokreśla ścieżkę uruchamianej aplikacji
  • USERDATAokreśla dodatkowe argumenty dla uruchamianej aplikacji

Przykład tworzenia takiego obiektu PROCESS może mieć postać:

DEFINE PROCESS (MYAPP_PROCESS) + 


DESCR ('My Application Process') + 


APPLTYPE (UNIX) + 


APPLICID ('/usr/local/myadapter') + 


USERDATA ('mode debug')


Uruchomienie trigger monitora

W celu uruchomienia trigger monitora należy uruchomić proces runmqtrm z parametrami:

  • -mnazwa menadżera kolejek, na której znajduje się kolejka inicjująca
  • -qnazwa kolejki inicjującej, która ma być czytana przez trigger monitora

Przykład takiej komendy może mieć postać:

runmqtrm -m QMGR1 -q QUEUE.INIT

Triggering kanałów

W przypadku komunikacji pomiędzy kanałami również możemy zastosować triggering. Jako triggering mamy tu na myśli uruchamianie kanałów po zdarzeniu jakim jest pojawienie się komunikatu w kolejce transmisyjnej. W kolejce transmisyjnej znajdują się komunikaty które mają zostać przetransportowane do innego menadżera kolejek za pomocą kolejki zdalnej. Tu jak w przypadku można tak skonfigurować konały tak, aby po odpowiednim czasie były one zatrzymane i w ten sposób zwalniały zasoby do momentu kiedy znów będą potrzebne, tj., kiedy pojawi się nowy komunikat do przesłania pomiędzy menadżerami. Za ponowne uruchamianie kanałów odpowiada specjalny dedykowany proces o nazwie chanel initiator. Aby zdefiniować triggering kanałów należy :

  • Kolejkę transmisyjną połączyć i kolejką inicjującą
  • Uruchomić proces channel initiator

Połączenie kolejki transmisyjnej z kolejką inicjującą

Z pojęciem triggerowania kanałów związane są następujące atrybuty kolejki transmisyjnej:

  • TRIGGERParametr oznacza włączenie triggerowanie kanału związanego z daną kolejką transmisyjną
  • INITQParametr określa nazwę kolejki inicjującej w której znajda się komunikaty oznaczające pojawienie zdarzenia jakim jest komunikat wrzucony do pustej kolejki. Najczęściej parametr ten jest ustawiony na kolejkę systemową SYSTEM.CHANNEL.INITQ.
  • TRIGDATAParametr określa nazwę kanału do uruchomienia. W przypadku, kiedy to pole jest puste uruchomiony zostanie kanał, który jest związany z daną kolejką transmisyjną.

Przykładowa komenda tworząca kolejkę transmisyjną przystosowaną do triggerowania kanałów może mieć postać:

DEFINE QLOCAL(QMGR2) +


TRIGGER +


INITQ(SYSTEM.CHANNEL.INITQ) + 


USAGE (XMITQ) 


Uruchomienie procesu channel initiator

W celu uruchomienia procesu channel initiator należy uruchomić jego proces za pomocą konsoli tekstowej i polecenia START CHINIT . Jego najważniejszym argumentem jest INITQ określający nazwę kolejki inicjującej. Przykład takiej komendy może mieć postać:

START CHINIT INITQ(SYSTEM.CHANNEL.INITQ)

Standardowy proces chanel initiator jest uruchamiany wraz z uruchomieniem menadżera kolejek i razem z menadżerem kolejek jest zatrzymywany.


powrót
Zachęcam do przedstawienia swoich uwag i opinii w polu komentarzy.

Komentarze

Dodaj Komentarz