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

Podobne dokumenty