Silesia JUG : Java Message Service
-
Upload
marekgoldmann -
Category
Technology
-
view
2.186 -
download
3
description
Transcript of Silesia JUG : Java Message Service
Java Message ServiceMarek Goldmann
Silesia JUG
Agenda
• Zastosowanie JMS• Podstawy
• Terminy• Architektury i modele
• ...przeplatane demkami
JMS!? Po co to nam?
Integracja
...ale nie tylko!
Zastosowania JMS
• SOA• Event-driven architecture• B2B• Rozgłaszanie informacji (broadcast)• Budowa rozproszonych systemów
Integracja
• Dane zawsze będą wymieniane pomiędzy systemami• Najczęściej różne języki
?
Sposoby wymiany danych
• RPC• FTP• Webservice/REST• Współdzielenie bazy danych• Zdarzenia
...i powody, dla których nie powinniśmy ich wybierać
Remote Procedure Call?
Remote Procedure Call?
• Przywiązanie do interfejsu i jego lokalizacji• Synchroniczne zapytania• Trudno dodać nowe funkcjonalności
File Transfer Protocol?
File Transfer Protocol?
• Kodowanie plików• Bezpieczeństwo• Konwencje
Webservice/REST
Webservice/REST
• Niezawodność
Współdzielenie bazy danych
Współdzielenie bazy danych
• Naprawdę ktoś wymyślił coś takiego?!?
I tutaj dochodzimy do architektury zdarzeniowej
Nie! Nie jest ona pozbawiona wad!
Wady architektury zdarzeniowej
• Złożony model programistyczny• Kolejność wiadomości• Monitorowanie?
Czy model zdarzeniowy to to samo co przesyłanie wiadomości?
Nie do końca
Model zdarzeniowy oparty jest na przesyłaniu wiadomości
OK, wróćmy do JMS
• Asynchroniczność• Niezawodność• Skalowalność
Cechy JMS
1.Wiadomość zostawiamy w kanale2.Możemy robić coś innego3.Zostajemy (lub nie) poinformowani o zakończeniu procesu przetwarzania żądania
Asynchroniczność
• Wiadomości w kanale są przechowywane nawet w przypadku awarii (restartu) serwera JMS
Niezawodność
Skalowalność
Queue
Skalowalność
Queue
Skalowalność
Queue
•Centralna•Rozproszona
Architektury messagingu
Architektura centralna
Architektura rozproszona
Router
Modele przesyłania wiadomości
• Point-to-point• Publish-and-subscribe
• application• client
• consumer• receiver (P2P)• subscriber (Pub-sub)
• producer• sender (P2P)• publisher (Pub-sub)
• provider – JMS service
Kilka terminów aby zamieszać
Point-to-point
Sender Queue
Receiver
Receiver
• Wysyłanie asynchronicznych i synchronicznych wiadomości za pomocą kolejek
• Wiadomość wysłana do kolejki jest odbierana przez tylko jednego odbiorcę
• Wiadomości są szeregowane• Wiadomości są zawsze dostarczane• Dobry model do równoważenia obciążenia
Point-to-point
• Modele wysyłania wiadomości• Fire and forget• Request/Reply
• Model odbierania wiadomości• Pull
Point-to-point
Demo P2P
Publish-and-subscribe
Publisher Topic
Subscriber
Subscriber
• Wysyłanie asynchronicznych wiadomości za pomocą tematów• Broadcasting
• Wiadomość odbierana przez wszystkich konsumentów• Nie interesuje nas kto (i czy!) odbierze wiadomość
• Klient odbiera kopię wiadomości
Publish-and-subscribe
• Modele wysyłania wiadomości• Fire and forget
• Model odbierania wiadomości• Push
Publish-and-subscribe
Demo Pub-sub
Properties p = new Properties();p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");p.put(Context.URL_PKG_PREFIXES, " org.jboss.naming:org.jnp.interfaces");p.put(Context.PROVIDER_URL, "jnp://localhost:1099");
context = new InitialContext(p);connectionFactory = (ConnectionFactory) context.lookup("/ConnectionFactory");
QueueConnection queueConnection = (QueueConnection) connectionFactory.createConnection();QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) context.lookup("queue/SimpleQueue");
QueueSender queueSender = queueSession.createSender(queue);
for (int i = 0; i <= 20; i++) { String text = i + ", data: " + new Date(); System.out.println("Wysyłam: " + text);
TextMessage message = queueSession.createTextMessage(text); queueSender.send(message);}
queueConnection.close();
Wysyłanie wiadomości
Properties p = new Properties();p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");p.put(Context.URL_PKG_PREFIXES, " org.jboss.naming:org.jnp.interfaces");p.put(Context.PROVIDER_URL, "jnp://localhost:1099");
context = new InitialContext(p);connectionFactory = (ConnectionFactory) context.lookup("/ConnectionFactory");
QueueConnection queueConnection = (QueueConnection) connectionFactory.createConnection();QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) context.lookup("queue/SimpleQueue");
QueueSender queueSender = queueSession.createSender(queue);
for (int i = 0; i <= 20; i++) { String text = i + ", data: " + new Date(); System.out.println("Wysyłam: " + text);
TextMessage message = queueSession.createTextMessage(text); queueSender.send(message);}
queueConnection.close();
Wysyłanie wiadomościSpecyficzne dla JBoss AS
123456
789
• Nagłówki• Właściwości• Dane
Składniki wiadomości
•StreamMessage
•ByteMessage
•TextMessage
•ObjectMessage
•MapMessage
Rodzaje wiadomości
• JMSDestination• JMSDeliveryMode•DeliveryMode.PERSISTENT
•DeliveryMode.NON_PERSISTENT
• JMSMessageID• JMSReplyTo• ...
Nagłówki
Właściwości
TextMessage message = pubSession.createTextMessage();message.setText(text);
message.setStringProperty("username",username);
publisher.publish(message);
A teraz trochę ciekawsze rzeczy...
• Przeglądanie wiadomości z kolejki bez ich pobierania
• Pracuje na kopiach wiadomości, które znajdowały się w czasie tworzenia tego obiektu w kolejce
QueueBrowser
• Używane przy modelu request-reply• JMSReplyTo
• Czasem przedstawiane jako anti-pattern
Kolejki tymczasowe
Demo Request-reply
• Otrzymujemy tylko te wiadomości, którymi jesteśmy zainteresowani
• Dostępne zarówno dla kolejek jak i tematów• Filtrowanie za pomocą właściwości i języka SQL-92
Filtrowanie wiadomości
Demo
Tworzenie filtrów w kodzie
public QueueReceiver createReceiver(Queue queue, String messageSelector)
public TopicSubscriber createSubscriber(Topic topic, String messageSelector, boolean noLocal)
session.createReceiver(myQueue, "InventoryID = 'S93740283-02' AND Quantity BETWEEN 1000 AND 13000")
• Transakcje• potwierdzenia wiadomości
• ponowne wysyłanie
• Kolejki dla martwych wiadomości• Grupowanie wiadomości• Zasada działania MDB• Bezpieczeństwo• ...
O czym nie mówiłem
Pytania?
Źródła
• Java Message Service – O’Reilly• EJB3 – O’Reilly