Ćwiczenie 1. Kolejki IBM Message Queue (MQ) 1. Przygotowanie Przed rozpoczęciem pracy, należy uruchomić "Kreator przygotowania WebSphere MQ" oraz przejść przez wszystkie kroki kreatora, na końcu zaznaczając "Uruchom IBM WebSphere MQ Explorer". 1
2. Tworzenie kolejek Aby rozpocząć pracę z kolejkami w pierwszej kolejności należy stworzyć menadżera naszej kolejki i pierwszą kolejkę. Klikamy prawym przyciskiem myszy na "Nowa", wybieramy "Menadżer kolejek...". Wpisujemy nazwę menadżera kolejek, np. "MQM1", zaznaczamy "Ustaw jako domyślny menadżer kolejek", klikamy "Zakończ". Aby zobaczyć, co kryje się pod menadżerem kolejki, klikamy na trójkątny przycisk po lewej stronie, rozwijając listę. Pierwszą pozycją jest "Kolejki". Klikamy na pozycję prawym przyciskiem myszy i wybieramy "Nowa", "Kolejka lokalna". Nadajemy jej nazwę np. "Q1" i klikamy "Zakończ". Stworzyliśmy pierwszą kolejkę lokalną. W niej przechowywane będą komunikaty, do momentu odebrania ich przez aplikację. Aby przetestować jej działanie klikamy na kolejce prawym przyciskiem myszy i wybieramy "Umieść komunikat testowy...". Po czym wprowadzamy komunikat. 2
Możemy zauważyć, że po chwili (po odświeżeniu) wartość "Bieżąca głębokość kolejki" zwiększy się. Komunikat możemy podejrzeć otwierając menu kontekstowe i wybierając "Przeglądaj komunikaty...". 3
3. Udostępnienie kolejki aplikacji. Aby udostępnić kolejkę musimy stworzyć odpowiedni kanał. Po rozwinięciu struktury pod naszym menadżerem kolejek znajdziemy element "Kanały". Klikamy na niego prawym przyciskiem myszy, wybieramy "Nowa" i "Kanał połączenia z serwerem..." Podajemy jego nazwę, np. "CQ1", klikamy "Dalej". Po prawej stronie okna wybieramy zakładkę "MCA". Tam wpisujemy nazwę użytkownika, na którego jesteśmy zalogowani (który docelowo będzie pobierał komunikaty z kolejki), np. "Student". Po wpisaniu nazwy użytkownika klikamy "Zakończ". 4
4. Pobieranie komunikatu z kolejki Do pobierania komunikatów z kolejki proszę stworzyć aplikację w języku Java. Poniżej przedstawiono przykładowy kod i kilka wskazówek. A) Do projektu należy dodać biblioteki IBM MQ, standardowo znajdujące się w katalogu: "C:\Program Files\IBM\WebSphere MQ\java\lib" B) Dokumentacja dotycząca bibliotek MQ znajduje się tutaj: http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic= %2Fcom.ibm.mq.javadoc.doc%2FWMQJMSClasses%2Findex.html Do napisania aplikacji odbierającej komunikaty może być przydatny poniższy kod: import java.io.bufferedreader; import java.io.file; import java.io.filenotfoundexception; import java.io.filereader; import java.io.ioexception; import com.ibm.mq.*; import com.ibm.mq.constants.cmqc; public class ReadMessage{ private String qmanager; private String QueueName; public static void main(string args[]) { MQEnvironment.hostname = "localhost"; MQEnvironment.port = 1414; MQEnvironment.channel = "CQ1"; ReadMessage gm = new ReadMessage(); gm.qmanager = "MQM1"; gm.queuename = "Q1"; gm.runnow(); public void runnow() { MQQueueManager qmgr = null; MQQueue queue = null; try { // Tworzenie połą czenia z menadż erem kolejek System.out.println("Łączenie z menadżerem kolejek: "+qmanager); qmgr = new MQQueueManager(qManager); int openoptions = CMQC.MQOO_INQUIRE + CMQC.MQOO_FAIL_IF_QUIESCING + CMQC.MQOO_INPUT_SHARED; System.out.println("Dostę p do kolejki: " + QueueName); queue = qmgr.accessqueue(queuename, openoptions); // Tworzenie obiektu kolejki String msgtext = ""; 5
MQMessage rcvmessage = new MQMessage(); queue.get(rcvmessage); byte[] b = new byte[rcvmessage.getmessagelength()]; rcvmessage.readfully(b); msgtext = new String(b); System.out.println("Read Request Message: " + msgtext); catch (MQException ex) { int MQRC_NO_MSG_AVAILABLE = 2033; if (ex.reasoncode == MQRC_NO_MSG_AVAILABLE) { System.out.println("No message on the specified queue: " + QueueName ); else { System.out.println("A WebSphere MQ Error occured : Completion Code " + ex.completioncode + " Reason Code " + ex.reasoncode); catch (java.io.ioexception ex) { System.out.println("An IOException occured while reading to the message buffer: " + ex); catch (Exception ex) { System.out.println("Some other exception!: " + ex); finally { try { System.out.println("Closing the queue"); queue.close(); System.out.println("Disconnecting from the Queue Manager"); qmgr.disconnect(); System.out.println("Done!"); catch(exception e) { System.out.println("Error in finally!"); Możliwe problemy: Zwracane błędy: Kody błędów wraz z opisem znajdują się na stronie: http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic= %2Fcom.ibm.mq.amqzao.doc%2Ffm12610_.htm Brak dostępu do kolejki: Należy wybrać właściwości menażera kolejki, w zakładce "Komunikacja" wybrać "Rekordy uwierzytelniania kanału" - Wyłączone 6
5. Wysyłanie komunikatów do kolejki Proszę stworzyć aplikację, która pobiera plik testowy z danego katalogu, następnie umieszcza jego treść w kolejce MQ. Poprawność wykonania zweryfikować pierwszą aplikacją. Przydatne metody: byte[] messageid = rcvmessage.messageid; // pobieranie ID odebranego komunikatu MQMessage msg = new MQMessage(); // Tworzenie nowej wiadomości msg.correlationid = messageid; // Ustawianie powiązania (przy odpowiadaniu na konkretn ą wiadomo ść) String qmessage = "Tre ść wiadomoś ci" ; msg.writestring(qmessage); // Dodawanie treści do komunikatu MQPutMessageOptions pmo = new MQPutMessageOptions(); queue.put(msg, pmo); queue.close(); qmgr.disconnect(); 7
6. Przesyłanie komunikatów między kolejkami (kanały) Aby przetestować przesyłanie komunikatów pomiędzy dwiema różnymi kolejkami należy analogicznie do punktu drugiego stworzyć nowego menażera kolejek. Uwaga! Przy tworzeniu drugiego menażera kolejek należy wybrać port 1415 - ponieważ 1414 jest już zajęty przez menadżera MQM1. Nowego menadżera możemy nazwać "MQM2". Po rozwinięciu listy "MQM2" klikamy na element "Kolejki", wybieramy "Nowa" i "Definicja kolejki zdalnej..." W kreatorze podajemy jej nazwę, np. "Q1", klikamy "Dalej". W nowym oknie musimy zdefiniować, do której kolejki będziemy przekazywać komunikaty, w polu "Kolejka zdalna" podajemy nazwę naszej kolejki z punktu drugiego (domyślnie "Q1") oraz w polu "Menadżer kolejek zdalnych" nazwę menadżera z punktu 2 ("MQM1"). Pole "Kolejka transmisji" pozostawiamy puste i klikamy "Zakończ". Następnie otwieramy kreator tworzenia kolejek lokalnych dla naszego nowego menadżera kolejek. Nową kolejką dla MQM2 nazywamy tak, jak pierwszy menadżer kolejek, czyli "MQM1" i w kreatorze klikamy "Dalej", w polu "Użycie" wybieramy wartość "Transmisja", następnie "Zakończ". W kolejnym kroku zapewniamy możliwość przekazywania komunikatów z zdalnej kolejki w MQM2 do lokalnej w MQM1. W tym celu musimy otworzyć kanał odbierający i wysyłający. Dla pierwszego menadżera tworzymy kanał odbierający. Rozwijamy listę pod MQM1 i klikamy prawym przyciskiem myszy na "Kanały". Wybieramy "Nowa", "Kanał odbierający...". Podajemy jego nazwę np. "C.MQM1.MQM2" i klikamy na "Zakończ". 8
Dla drugiego menadżera należy stworzyć kanał wysyłający. Analogicznie, w MQM2 wybieramy "Nowa" i "Kanał wysyłający". PodajemyPodajemy taką samą nazwę, tzn. "C. MQM1.MQM2" i naciskamy przycisk "Dalej", gdzie w polu "Nazwa połączenia" wpisujemy lokalizację komputera, na którym znajduje się kolejka odbierająca - w naszym przypadku jest to "localhost(1414)". W polu "Kolejka transmisji" proszę o podanie nazwy kolejki, która będzie odbierać komunikaty - w naszym przypadku domyślnie jest to "Q1". Po wpisaniu nazwy kolejki "Zakończ". Po stworzeniu kanału uruchamiamy go klikając na nim prawym przyciskiem myszy i wybierając "Uruchom". Aby przetestować połączenie pomiędzy kolejkami wstawiamy komunikat "ręcznie" za pomocą WebSphere MQ Explorer'a do kolejki Q1 w drugim menadżerze (MQM2). Wiadomość powinna zostać przesłana do kolejki w pierwszym menadżerze (MQM1). 9
7. Zadanie Napisać prosty komunikator komunikujący się za pośrednictwem kolejek. 10