WYDZIAŁ ELEKTRONIKI INFORMATYKI I TELEKOMUNIKACJI Projekt CHAT wykorzystuj cy pakiet JMS w oparciu o serwer SonicMQ Wykonali: Barbara Le niewska Krzysztof Macuda
Wst p Problem integracji i wymiany danych mi dzy systemami informatycznymi nie jest rzecz trywialn. Wyobra my sobie, na przykład, ile pracy i czasu nale ałoby po wi ci, aby umo liwi powiadamianie przez hurtownie swych potencjalnych odbiorców o zmianach cen, okresowych promocjach, nowych produktach itp. Zmuszeni byliby my do opracowania unikatowego protokołu, zapewnienia poprawno ci dostarczenia danych, obsługi transakcji, tworzenia okre lonych ilo ci kopii danych w celu ich dostarczenia do odbiorców, a w przypadku rozwi zania skalowanego - zaprojektowania i implementacji serwera komunikacyjnego. Przyjrzyjmy si jak, do tego podeszła firma Sun Microsystems, projektuj c specyfikacj JMS (Java Message Service) i firma Progress, tworz c serwer komunikatów SonicMQ.
Java Message Service Fundamentalnym elementem specyfikacji JMS jest poj cie komunikatu. Poprzez komunikat rozumiemy pewn dawk informacji o okre lonym formacie. Komunikat taki mo e by przesyłany dwukierunkowo mi dzy klientem a serwerem komunikatów (w takim systemie nigdy nie dochodzi do bezpo redniej komunikacji mi dzy systemami klienckimi). Komunikat składa si z nagłówka i zawarto ci. Nagłówek zawiera pola okre laj ce przeznaczenie, typ komunikatu, identyfikator, priorytet i trwało. Zawarto komunikatu mo e by tekst, strumienie zawieraj ce warto ci typów prostych i szeregowane obiekty Java. W nagłówku okre lony jest doł czonej zawarto ci komunikatu. Java Message Service udost pnia dwa modele komunikacji: Poin-to-Point Publish/Subscribe W obu modelach dostarczanie komunikatów i ich odbiór odbywa si asynchroniczny. w sposób Model Poin-to-Point, wykorzystuje kolejki, do których przesyłane s komunikaty. W modelu tym, istnieje dokładnie jeden nadawca i jeden odbiorca. Przesyłane komunikaty mog by trwałe, co oznacza, e b d przechowywane przez okre lony czas w serwerze komunikatów. Dzieje si tak tylko wówczas, gdy wcze niej, został zarejestrowany odbiorca komunikatów z kolejki i w chwili wysłania komunikatu nie był on przył czony do serwera. Maksymalny czas przechowywania komunikatu nie jest okre lony przez JMS. Wyra amy go w milisekundach lub podaj c zero sprawiamy, e b dzie przechowywany tak długo, a nie zostanie odebrany, lub usuni ty w trybie administracyjnym. Do utworzenia nowego obiektu QueueConection, który jest aktywnym poł czeniem do serwera, wykorzystywana jest metoda QueueConnectionFactory. Klient u ywa obiektu QueueConnection do utworzenia jednej lub wielu sesji QueueSession wykorzystywanych w celu wysyłania i odbierania komunikatów. Sesja QueueSession dostarcza metod umo liwiaj cych tworzenie obiektów typu QueueSender i QueueResiver. Obiekt QueueSender słu y do wysyłania komunikatów do kolejki, natomiast QueueReceiver do odbierania komunikatów opublikowanych we wskazanej kolejce. Mo liwe jest równie utworzenie dwóch obiektów QueueReceiver dla tej samej kolejki. W nagłówku komunikatu mog by zawarte informacje umo liwiaj ce odbiór wyselekcjonowanej grupy komunikatów. W modelu, Publish/Subscribe, komunikaty przesyłane s do okre lonych w złów zwanych tematami (topics). Wyst puje w tym modelu jeden nadawca komunikatów i wielu
odbiorców (z punktu widzenia nadawcy, odbiorcy s anonimowi, a ich liczba jest nieznana). JMS nie definiuje zasad tworzenia, administracji i usuwania tematu. JMS nie wprowadza te restrykcji okre laj cych, w jaki sposób obiekt tematu jest rejestrowany. Mo e on by zarówno ko cowym elementem w hierarchicznej strukturze tematu, jak i elementem grupuj cym wiele tematów w tej hierarchii(w celu równoczesnej subskrypcji wielu tematów). Organizacja tematów i sposób ich subskrypcji to bardzo wa ne elementy architektury aplikacji wykorzystuj cej model Publish/Subscribe. Klient u ywa metody TopicConnecionFactory do tworzenia poł czenia TopicConnection z serwerem komunikatów. TopicConnection jest aktywnym poł czeniem, którego klient u ywa do tworzenia jednej lub wielu sesji TopicSessions, wykorzystywanych w celu wysłania i odebrania komunikatów. Sesja TopicSession dostarcza metod umo liwiaj cych tworzenie obiektów typu TopicPublisher i TopicSubscriber. Pierwszy z nich umo liwia wysyłanie komunikatów do tematu, natomiast drugi słu y klientowi do odbierania komunikatów opublikowanych we wskazanym temacie. Obiekt TopicSubscriber domy lnie nie umo liwia publikowania trwałych komunikatów. Słu y on tylko do odbioru komunikatów opublikowanych w chwili jego poł czenia z serwerem. Odbiór komunikatów mo e by filtrowany do tego celu słu elementy zawarte w nagłówku komunikatu. Odbiór komunikatów w obu modelach komunikacji wykorzystuje delegacyjny model obsługi zdarze. Obiekt oddelegowany do obsługi zdarze zwi zanych z nadchodz cymi komunikatami musi implementowa interfejs MessageListener i pokrywa jego metod onmessage. Argumentem metody onmessage jest obiekt, klasy Message, który reprezentuje odbierany komunikat. Progress SonicMQ SonicMQ jest serwerem komunikatów firmy Progress, b d cym kompletn implementacj standardu JMS. SonicMQ oddaje równie do dyspozycji twórców aplikacji internetowych dwie nowe funkcje: hierarchiczn przestrze nazw i mo liwo tworzenia aplikacji klienckich wykorzystuj cych kontrolki ActiveX. Oto główne cechy SonicMQ: wydajno Obsługa multipleksowanego Brokera pozwala przeł cza si mi dzy serwerami komunikatów w celu zapewnienia ci głego poł czenia. Funkcja ta udost pnia klientom mechanizm łatwej wymiany informacji w sieciach rozproszonych i poprawia ogóln wydajno. Asynchroniczne odpowiedzi umo liwiaj klientom oczekuj cym na odpowied kontynuacj zainicjowanych
procesów do czasu otrzymania odpowiedzi; inaczej ni w przypadku komunikacji dwukierunkowej. niezawodno Mechanizm gwarantowanego dostarczania komunikatów zapewnia wszystkim u ytkownikom ł cznie z u ytkownikami nie pracuj cymi w trybie podł czony i u ytkownikami mobilnymi odbiór wszystkich komunikatów. SonicMQ zawiera kompletne zabezpieczenia, obsługuje identyfikacj, autoryzacj, kontrol dost pu, cyfrowe certyfikaty i szyfrowanie kluczami 40- i 128- bitowymi. Komunikaty dostarczone do serwera s przechowywane w doł czonej bazie danych (lub poprzez JDBC w innej wskazanej bazie), dzi ki czemu zapewnione jest wi ksze bezpiecze stwo w przypadku awarii systemu. Wsparcie transakcji umo liwia grupowanie komunikatów w jednostki logiczne i wykonywanie na nich operacji commit i rollback jak na pojedynczym komunikacie. elastyczno Model komunikatów typu Point-to-Point obsługuje mechanizm dostarczania komunikatów do wskazania kolejek. Dzi ki temu mo ne je odebra tylko jeden klient, nawet w sytuacji, gdy wielu klientów monitoruje kolejk. Model komunikatów typu Publish-and-Subscriber umo liwia nadawcy wysyłanie komunikatów do tematów, które subskrybuje wielu klientów, a temat rozsyła do klientów kopie komunikatu. Komunikaty w formacie XML s własnym rozszerzeniem serwera SonicMQ w stosunku do standardowych typów technologii JMS. Łatwo u ycia Zdalna administracja czyni łatwym monitorowanie, zarz dzanie i konserwacj brokerów komunikatów, zarówno w systemach lokalnych jak i zdalnych. Wszystkie te czynno ci wykonywane s z jednego miejsca przy u yciu narz dzi graficznych lub narz dzi uruchamianych na konsoli tekstowej. Przezroczysto lokalizacji zapewnia mechanizm adresowania w oparciu o nagłówki. Zarówno klienci, jak i serwery mog zmienia lokalizacj bez konieczno ci dokonywania zmian w infrastrukturze komunikatów. Broker SonicMQ rozsyła komunikaty na podstawie nagłówka luz zawarto ci, a nie na podstawie adresu IP, jak to ma miejsce w tradycyjnych systemach komunikatów. Hierarchiczne adresowanie obsługuje hierarchi tematów i umo liwia klientowi inteligentne subskrybowanie wskazanych tematów wraz z podtematami. Klient nie musi wskazywa jedynie nazw tematów, lecz mo e subskrybowa grupy tematów bez konieczno ci znania ich nazw i liczno ci.
Implementacja głównych funkcji programu: Główne zmienne programu public TopicConnection polaczenie1=null;//aktywne poł czenie z serwerem public TopicSession sesja1=null;//sesja umo liwiaj ca odbieranie i wysyłanie komunikatów public TopicSubscriber subskrybcja=null;//umo liwia odbieranie komunikatów public TopicPublisher publikacja=null;//umo liwia wysyłanie komunikatów public Topic komunikacja=null;//temat; public progress.message.tools.brokermanager m_manager = null; //obiekt umo liwiaj cy utworzenie obiektu Queue public QueueConnection polaczenie2 = null; ;//aktywne poł czenie z serwerem public QueueSession sesja2 = null; //sesja do nadawania public QueueSession sesja3 = null; //sesja do nadawania public QueueReceiver nadsluch=null; //sesja do nadsluchiwania public QueueSender nadawanie = null; //obiekt do nadawania public Queue nadqueue=null; //obietk do nadsluchu Inicjacja poł czenia z serwerem SonicMQ boolean initjms(){ // UTWORZENIE POLACZENIA TYPU P/S //Utworzenie obiektu odpowiedzialnego za utworzenia poł czenia do brokera javax.jms.topicconnectionfactory factory1=null; try{ factory1 = (new progress.message.jclient.topicconnectionfactory ("tcp://"+textfield3.gettext()+":2506","12")); //Utworzenie poł czenia do brokera polaczenie1=factory1.createtopicconnection(this.uzt,this.has); //Utworzenie sesji sesja1=polaczenie1.createtopicsession(false,javax.jms.session.auto_acknowledge); //Utworzenie tematu
komunikacja=sesja1.createtopic("kom"); //Obiekt umo liwiaj cy subskrybowanie komunikatów subskrybcja=sesja1.createsubscriber(komunikacja); //Obiekt umo liwiaj cy publikowanie publikacja=sesja1.createpublisher(komunikacja); //Ustawienie obiektu zainteresowanego nadsłuchiwaniem nadchodz cych komunikatów subskrybcja.setmessagelistener(this); //Urucomienie polaczenia polaczenie1.start(); //UTWORZENIE POLACZENIA TYPU PTP //Utworzenie obiektu odpowiedzialnego za utworzenia poł czenia do brokera javax.jms.queueconnectionfactory factory2; factory2 = (new progress.message.jclient.queueconnectionfactory ("tcp://"+textfield3.gettext()+":2506","121")); //Utworzenie polaczenia do brokera polaczenie2 = factory2.createqueueconnection (this.uzt+"priv",this.has); //Uruchomienie poł czenia polaczenie2.start(); //Sesja do odbierania sesja2 = polaczenie2.createqueuesession (true, javax.jms.session.auto_acknowledge); //Sesja do nadawania sesja3=polaczenie2.createqueuesession(false,javax.jms.session.auto_acknowledge); try{
//Utworzenie mened era brokera this.createmanager(); //Stworzenie obiektu odpowiadaj cego za odbiór wiadomo ci do danej osoby this.createqueues(); catch (Exception e){ //Wybór obiektu do nadsłuchiwania informacji do danej osoby javax.jms.queue nqueue = sesja2.createqueue (this.uzt); //Utworzenie sesji do odbioru komunikatów nadsluch = sesja2.createreceiver(nqueue); //Ustawienie obiektu zainteresowanego nadsłuchiwaniem nadchodz cych komunikatów nadsluch.setmessagelistener(this); ustaw("< Uzytkownik polaczyl sie z serwerem komunikatow >\n"); catch(javax.jms.jmsexception jmse){ jmse.printstacktrace(); ustaw("< Nieprawidlowy login, haslo lub nazwa hosta. >\n< Uzytokwnik nie zostal polaczony do serwera. >"); return false; button1.disable(); return true; Obsługa nadchodz cych komunikatów public void onmessage(javax.jms.message message){ try{ TextMessage textmessage=(textmessage) message; //Odczyt zawartosci komunikatu String wiad=new String(textMessage.getText()); ustaw(wiad); catch(javax.jms.jmsexception jmse){ jmse.printstacktrace();
Wysyłanie komunikatów do wszyskich uzytkowników public void wyslij(string mesg){ try{ TextMessage wiadomosc= sesja1.createtextmessage(); //Ustawienie własno ci komunikatu wiadomosc.setstringproperty("klucz","a12"); //Wprowadzenie tre ci komunikatu wiadomosc.settext(mesg); //Wysłanie wiadomo ci publikacja.publish(wiadomosc); catch(javax.jms.jmsexception jmse){ jmse.printstacktrace(); Wysłanie wiadomo ci do danego u ytkownika public void wyslij(){ try{ nadqueue=sesja3.createqueue (dokogo); nadawanie=sesja3.createsender(nadqueue); javax.jms.textmessage msg = sesja2.createtextmessage(); ustaw("priv "+this.uzt+": "+textarea2.gettext()); msg.settext("priv "+this.uzt+": "+textarea2.gettext()); nadawanie.send(msg); textarea2.settext(""); catch(javax.jms.jmsexception jmse){ jmse.printstacktrace();
Obsługa programu W celu nawi zania poł czenia nale y wypełni pola u ytkownik, hasło oraz host (adres serwera komunikatów) i wcisn przycisk Polaczenie. Po uzyskaniu poł czenia zostaj uaktywnione przyciski Wyslij, Wyslij do. Aby wysła wiadomo nale y wpisa tekst w pole dolne i nacisn przycisk Wyslij. Komunikat zostanie wysłany do wszystkich u ytkowników. Chc c wysła wiadomo do danej osoby wpisujemy tekst do pola dolnego, wpisujemy nazw osoby, do której wysyłamy wiadomo w pole Wyslij do oraz wciskamy przycisk Wyslij do.