laboratorium 6
Transkrypt
laboratorium 6
AUI Laboratorium 6. Architektury Usług Internetowych Laboratorium 6. JMS Wstęp Java Message Service (JMS) jest standardem definiującym asynchroniczną komunikację p2p luźno połączonych elementów. Komunikacja oparta jest na pośredniej wymianie wiadomości. Klienci zamiast adresować wiadomość na konkretnego odbiorcę oznaczają jedynie na jaki zasób (cel) ma zostać ona dostarczona. Na jednym zasobie może nasłuchiwać jeden lub więcej niezależnych klientów. JMS jest elementem specyfikacji Java EE ale może być wykorzystywany również na w aplikacjach desktopowych. Wymagany jest jedynie serwer zarządzający zasobami i połączeniami oraz odpowiednie biblioteki. JMS składa się z następujących elementów: • JMS Provider – system wymiany wiadomości, • JMS Clients – konsumenci i producenci wiadomości, • Messages – obiekty wymieniane w wiadomościach, • Administered objects – obiekty wykorzystywane przez klientów: ◦ cele, ◦ fabryki połączeń. JMS definiuje dwa modele działania: kolejka i temat. Kolejka: Temat: • jedna wiadomość jest konsumowana • wiadomość dostarczana jest do tylko przez jednego klienta, wszystkich aktywnych klientów, • podczas przesyłania wiadomości nie • podczas przesyłania wiadomości jest koniecznie istnienie konsumenta, konieczne jest istnienie konsumenta, • wiadomość jest przechowywana • wiadomość jest przekazywana jedynie w kolejce aż pojawi się konsument do aktywnych klientów, w przypadku gotowy ją obsłużyć. braku takowych jest tracona. ActiveMQ Istnieje wiele implementacji standardu JMS. Podczas laboratorium zostanie wykorzystany Apache ActiveMQ, serwer zgodny ze specyfikacją JMS 1.1. Szczegóły można znaleźć na stronie domowej projektu: http://activemq.apache.org/. © 2010 - 2012 Michał Wójcik 1 AUI Laboratorium 6. Aby zainstalować serwer należy pobrać odpowiednią wersję ze strony: http://activemq.apache.org/activemq-570-release.html oraz rozpakować ją w wybranym katalogu. Uruchomienie i zatrzymanie serwera wykonuje się z wykorzystaniem polecenia activemq: • $ACTIVEMQ_HOME/bin/activemq start, • $ACTIVEMQ_HOME/bin/activemq stop. Po uruchomieniu serwera dostępny będzie webowy panel administracyjny pozwalający na monitorowanie kolejek i tematów. Panel domyślnie dostępny jest pod adresem: http://localhost:8161/admin/. Skonfigurowanie nowych celów wymaga jedynie modyfikacji w pliku konfiguracyjnym oraz restartu serwera. Wszystkie zmiany należy wprowadzać w pliku $ACTIVEMQ_HOME/conf/activemq.xml. Aby zdefiniować nowy cel należ w sekcji <destinations> dodać odpowiednio <queue> dla kolejki i <topic> dla tematu. W obu przypadkach należy podać nazwę celu, która później zostanie wykorzystana po stronie klienta. <beans> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" /> <broker xmlns="http://activemq.apache.org/schema/core"> ... <destinations> <queue physicalName="aui.queue" /> <topic physicalName="aui.topic" /> </destinations> ... </broker> </beans> JMS definiuje sześć typów wiadomości jakie mogą być wymieniane pomiędzy klientami: • TextMessage – przesyłanie obiektów String, • MapMessage – mapy String → dowolny typ prymitywny, • BytesMessage – wiadomość binarna, • StreamMessage – strumień wartości prymitywnych typów, • ObjectMessage – serializowalny obiekt, • Message – zawiera tylko nagłówek i właściwości (bez ciała wiadomości). Aplikacja kliencka Podczas laboratorium zarówno konsumenci jak i producenci wiadomości zostaną zrealizowani jako aplikacje Java SE. Aby wykorzystać funkcjonalność JMS należy dodać do projektu odpowiednią bibliotekę, w tym przypadku jest to: $ACTIVEMQ_HOME/activemq-all-5.7.0.jar. © 2010 - 2012 Michał Wójcik 2 AUI Laboratorium 6. W celu przygotowania konsumenta wiadomości należy zaimplementować interfejs MessageListener i nadpisać metodę onMessage, która będzie wywoływana asynchronicznie w momencie przyjścia wiadomości. public class Consumer implements MessageListener { } @Override public void onMessage(Message msg) { ... } W celu zarejestrowania konsumenta na wybranym celu należy stworzyć fabrykę połączeń, która następnie posłuży stworzeniu konkretnego połączenia. Na połączeniu tworzona jest sesja klienta, w ramach której będę przesyłane wiadomości. Następnie za pomocą obiektu sesji tworzony jest konsument dla konkretnego celu (w tym przypadku kolejki) przez podanie nazwy wcześniej skonfigurowanej po stronie serwera. Na końcu należy podać obiekt implementujący interfejs MessageListener i znacjonalizować połączenie. ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer consumer = session.createConsumer(new ActiveMQQueue("nazwa_kolejki")); consumer.setMessageListener(new MessageListener(){}); connection.start(); W przypadku producenta konfiguracja wygląda analogicznie. ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(new ActiveMQQueue("nazwa_kolejki")); W celu wysłania wiadomości, należy ją stworzyć w ramach konkretnej sesji a następnie wysłać ją za pomocą obiektu producenta. TextMessage msg = session.createTextMessage("Treść wiadomości"); producer.send(msg); Aby wykorzystać temat zamiast kolejki należy podmienić jedynie argumenty przesyłane do metod odpowiedzialnych za tworzenie producenta i konsumenta. Pozostały kod jest niezależny od typu wykorzystanego celu. MessageProducer producer = session.createProducer(new ActiveMQTopic("nazwa_tematu"); MessageConsumer consumer = session.createConsumer(new ActiveMQTopic("nazwa_tematu")); Należy zwrócić uwagę że w przykładzie wykorzystane są klasy pochodzące z dwóch pakietów: © 2010 - 2012 Michał Wójcik 3 AUI Laboratorium 6. • • javax.jms – klasy zdefiniowane przez standard JMS, niezależne od konkretnej implementacji, kod, który je wykorzystuje jest przenośny pomiędzy różnymi implementacjami JMS: ◦ Connection, ◦ JMSException, ◦ Message, ◦ MessageConsumer, ◦ MessageProducer, ◦ MessageListener, ◦ Session, ◦ javax.jms.TextMessage; org.apache.activemq – klasy zdefiniowane w ramach projektu ActiveMQ, są nie przenośnie pomiędzy różnymi implementacjami i zostały wykorzystane jedynie do nawiązywania połączenia (wykorzystanie jedynie standardowych pakietów wymagałoby dodatkowej konfiguracji JNDI dla nawiązywania połączeń z serwerem): ◦ ActiveMQConnectionFactory, ◦ ActiveMQQueue. © 2010 - 2012 Michał Wójcik 4