![]() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| C/C++ / CGI / Sieć Novell / PHP / Java / SQL / Oracle / WebSphere MQ / WebSphere Message Broker / JavaScript / Humor / IT Quiz | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|
![]() |
Message Broker posiada nody odpowiadające za komunikacje HTTP z i do Brokera.
Nody te to:
Najważniejsze parametry noda HTTPRequest to: Web Service URL Parametr ten określa URL zdalnego Web Service. Jeśli chcemy możemy ta wartość ustawić dynamicznie w kodzie : SET OutputLocalEnvironment.Destination.HTTP.RequestURL='http://...'; Message Domain Określa domenę przy parsowaniu. Możliwe opcje to XML, XMLNS, MRM i inne. Message Set Jeśli domenę określimy jako MRM, w tym polu wybieramy Message Set. Najważniejsze parametry noda HTTPInput to: Path suffic for URL Parametr ten określa URL pod jakim oczekujemy połączeń HTTP Message Domain Określa domenę przy parsowaniu. Możliwe opcje to XML, XMLNS, MRM i inne. Message Set Jeśli domenę określimy jako MRM, w tym polu wybieramy Message Set. Nod HTTPReply służy tylko i wyłącznie do wysłania odpowiedzi HTTP. Nie ma zbyt wielu opcji. Najciekawsze to te związane z timeoutami. Poniżej postaram się zebrać kilka możliwych scenariuszy wykorzystania nodów w przepływie. W tym scenariuszu zaimplementujemy WebService na brokerze. Będzie to prosty WebService, który będzie sumował dwie liczby i zwracał ich sumę. W tym scenariuszu przepływ będzie zawierał nod HTTPInput, Compute oraz HTTPReply. Jako domenę w nodzie HTTPInput ustawiamy MRM.
CREATE COMPUTE MODULE WebServiceInput_Compute
Pierwszym elementem w przepływie będzie nod MQInput pobierający komunikaty MQ z kolejki. Następnie znajduje się nod Compute. W pierwszej części w module deklarujemy namespaces używane w WebService
DECLARE tns NAMESPACE 'http://www.myserver.com.pl/WSPilot/SimpleTypes';
CREATE FUNCTION processAddIntRequest()
CALL CopyEntireMessage();
CALL processAddIntRequest();
W pierwszej części w module deklarujemy ponownie namespaces używane w WebService
DECLARE tns NAMESPACE 'http://www.myserver.com.pl/WSPilot/SimpleTypes';
CREATE FUNCTION processAddIntResponse()
CALL CopyEntireMessage();
Dalej w funkcji Main usuwamy niepotrzebne już bloki danych HTTPRequestHeader, MRM, HTTPResponseHeader
SET OutputRoot.HTTPRequestHeader=null;
W kolejnej części funkcji Main tworzymy domenę MQMD zaraz po loku Properties, kopiujemy do bloku MQMD wcześniej zapisany w Environment blok myMQMD, ustawiamy parametr MsgType na MQMT_REPLY, parametr CorrelId na podstawie wejściowego MsgId, ustawiamy cel komunikatu oraz wywołujemy wcześniej zadeklarowaną funkcje processAddIntResponse.
CREATE NEXTSIBLING OF OutputRoot.Properties DOMAIN 'MQMD';
Dalej w przepływie mamy nod MQOutput ustawiony parametr Destination mode na Destination List, który wyśle odpowiedź MQ do odpowiednio zadeklarowanej wcześniej kolejki. W tym scenariuszu na brokerze będzie zdeployowany WebService, który na podstawie danych wejściowych będzie zapytanie wysyłał do odpowiedniej kolejki MQ i z drugiej strony będzie oczekiwał na odpowiedź MQ. Po otrzymaniu odpowiedzi MQ przepływ bedzie wysyłał odpowiedz WebService. Pierwszym elementem przepływu jest nod HTTPInput, którego zadaniem jest oczekiwanie na zapytania WebService. Następnym elementem jest nod Compute, którego zadaniem jest przygotowanie komunikatu MQ. W pierwszej części w module deklarujemy ponownie namespaces używane w WebService
DECLARE tns NAMESPACE 'http://www.myserver.com.pl/WSPilot/SimpleTypes';
CREATE NEXTSIBLING OF OutputRoot.Properties DOMAIN 'MQMD';
Następnie usuwamy pola Properties związane z WebService, ustawiamy odpowiednie pola MQMD, tworzymy zapytanie MQ na podstawie danych wejściowych i usuwamy zbędne pola HTTPInputHeader oraz MRM.
SET OutputRoot.Properties.MessageSet = '';
Następnie w przepływie znajduje się nod MQOutput, który wysyła zapytanie do aplikacji MQ, a zaraz za nim nod Compute, którego zadaniem jest wrzucenie dodatkowego komunikatu MQ zawierającego identyfikator zapytania WebServices do kolejki. W module Compute w pierwszej częsci kopiujemy Properties, MQMD oraz wskazujemy kolejkę w której zapisywane są identyfikatory zapytania WebService.
SET OutputRoot.Properties = InputRoot.Properties;
Następnie ustawiamy pole CorrelId komunikaty HTTP przepisując pole MsgId z wcześniej wysłanego komunikatu do kolejki aplikacyjnej oraz tworzymy treść komunikatu zawierającego identyfikator zapytania WebService.
SET OutputRoot.MQMD.CorrelId= InputLocalEnvironment.WrittenDestination.MQ.DestinationData.msgId;
Następnie mamy nod MQOutput którego zadaniem jest wrzucenie komunikatu do dedykowanej kolejki HTTP. Druga część przepływu odpowiada za odebranie komunikatu MQ odpowiedzi skorelowaniu go z komunikatem zawierającym identyfikator HTTP i wysłaniu odpowiedzi WebService do pytającego. Pierwszym elementem tej części jest nod MQInput oczekujący na kolejce w której pojawiają się odpowiedzi z aplikacji. Zaraz za nim jest nod MQGet z odpowiednio ustawionym parametrem wait interval oraz zaznaczonym polu Get By correlation ID i oczekującym na kolejce HTTP. Oznacza to, że nod pobierze z kolejki tylko komunikat którego Correlation Id jest identyczne jak Correlation Id odczytanego komunikatu odpowiedzi MQ. Jeśli aplikacja MQ ustawi Correlation Id odpowiedzi wstawiając w to miejsce message Id zapytania to nod MQGet zwróci odpowiedni komunikat HTTP. Po wyjściu z noda jeśli odczyta on komunikat procesowanie trafi do noda Compute. W pierwszej części w module znów deklarujemy namespaces używane w WebService
DECLARE tns NAMESPACE 'http://www.myserver.com.pl/WSPilot/SimpleTypes';
SET OutputRoot.Properties = InputRoot.Properties;
Następnie przepływ kończymy nodem HTTPReply wysyłającym odpowiedź WebService. |
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||