Silesia JUG : Java Message Service

59
Java Message Service Marek Goldmann Silesia JUG

description

Wprowadzenie do Java Message Service zaprezentowane na spotkaniu Silesia JUG 15.06.2010 przez Marka Goldmanna.

Transcript of Silesia JUG : Java Message Service

Page 1: Silesia JUG : Java Message Service

Java Message ServiceMarek Goldmann

Silesia JUG

Page 2: Silesia JUG : Java Message Service

Agenda

• Zastosowanie JMS• Podstawy

• Terminy• Architektury i modele

• ...przeplatane demkami

Page 3: Silesia JUG : Java Message Service

JMS!? Po co to nam?

Page 4: Silesia JUG : Java Message Service

Integracja

Page 5: Silesia JUG : Java Message Service

...ale nie tylko!

Page 6: Silesia JUG : Java Message Service

Zastosowania JMS

• SOA• Event-driven architecture• B2B• Rozgłaszanie informacji (broadcast)• Budowa rozproszonych systemów

Page 7: Silesia JUG : Java Message Service

Integracja

• Dane zawsze będą wymieniane pomiędzy systemami• Najczęściej różne języki

?

Page 8: Silesia JUG : Java Message Service

Sposoby wymiany danych

• RPC• FTP• Webservice/REST• Współdzielenie bazy danych• Zdarzenia

Page 9: Silesia JUG : Java Message Service

...i powody, dla których nie powinniśmy ich wybierać

Page 10: Silesia JUG : Java Message Service

Remote Procedure Call?

Page 11: Silesia JUG : Java Message Service

Remote Procedure Call?

• Przywiązanie do interfejsu i jego lokalizacji• Synchroniczne zapytania• Trudno dodać nowe funkcjonalności

Page 12: Silesia JUG : Java Message Service

File Transfer Protocol?

Page 13: Silesia JUG : Java Message Service

File Transfer Protocol?

• Kodowanie plików• Bezpieczeństwo• Konwencje

Page 14: Silesia JUG : Java Message Service

Webservice/REST

Page 15: Silesia JUG : Java Message Service

Webservice/REST

• Niezawodność

Page 16: Silesia JUG : Java Message Service

Współdzielenie bazy danych

Page 17: Silesia JUG : Java Message Service

Współdzielenie bazy danych

• Naprawdę ktoś wymyślił coś takiego?!?

Page 18: Silesia JUG : Java Message Service

I tutaj dochodzimy do architektury zdarzeniowej

Page 19: Silesia JUG : Java Message Service

Nie! Nie jest ona pozbawiona wad!

Page 20: Silesia JUG : Java Message Service

Wady architektury zdarzeniowej

• Złożony model programistyczny• Kolejność wiadomości• Monitorowanie?

Page 21: Silesia JUG : Java Message Service

Czy model zdarzeniowy to to samo co przesyłanie wiadomości?

Page 22: Silesia JUG : Java Message Service

Nie do końca

Page 23: Silesia JUG : Java Message Service

Model zdarzeniowy oparty jest na przesyłaniu wiadomości

Page 24: Silesia JUG : Java Message Service

OK, wróćmy do JMS

Page 25: Silesia JUG : Java Message Service

• Asynchroniczność• Niezawodność• Skalowalność

Cechy JMS

Page 26: Silesia JUG : Java Message Service

1.Wiadomość zostawiamy w kanale2.Możemy robić coś innego3.Zostajemy (lub nie) poinformowani o zakończeniu procesu przetwarzania żądania

Asynchroniczność

Page 27: Silesia JUG : Java Message Service

• Wiadomości w kanale są przechowywane nawet w przypadku awarii (restartu) serwera JMS

Niezawodność

Page 28: Silesia JUG : Java Message Service

Skalowalność

Queue

Page 29: Silesia JUG : Java Message Service

Skalowalność

Queue

Page 30: Silesia JUG : Java Message Service

Skalowalność

Queue

Page 31: Silesia JUG : Java Message Service

•Centralna•Rozproszona

Architektury messagingu

Page 32: Silesia JUG : Java Message Service

Architektura centralna

Page 33: Silesia JUG : Java Message Service

Architektura rozproszona

Router

Page 34: Silesia JUG : Java Message Service

Modele przesyłania wiadomości

• Point-to-point• Publish-and-subscribe

Page 35: Silesia JUG : Java Message Service

• application• client

• consumer• receiver (P2P)• subscriber (Pub-sub)

• producer• sender (P2P)• publisher (Pub-sub)

• provider – JMS service

Kilka terminów aby zamieszać

Page 36: Silesia JUG : Java Message Service

Point-to-point

Sender Queue

Receiver

Receiver

Page 37: Silesia JUG : Java Message Service

• 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

Page 38: Silesia JUG : Java Message Service

• Modele wysyłania wiadomości• Fire and forget• Request/Reply

• Model odbierania wiadomości• Pull

Point-to-point

Page 39: Silesia JUG : Java Message Service

Demo P2P

Page 40: Silesia JUG : Java Message Service

Publish-and-subscribe

Publisher Topic

Subscriber

Subscriber

Page 41: Silesia JUG : Java Message Service

• 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

Page 42: Silesia JUG : Java Message Service

• Modele wysyłania wiadomości• Fire and forget

• Model odbierania wiadomości• Push

Publish-and-subscribe

Page 43: Silesia JUG : Java Message Service

Demo Pub-sub

Page 44: Silesia JUG : Java Message Service

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

Page 45: Silesia JUG : Java Message Service

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

Page 46: Silesia JUG : Java Message Service

• Nagłówki• Właściwości• Dane

Składniki wiadomości

Page 47: Silesia JUG : Java Message Service

•StreamMessage

•ByteMessage

•TextMessage

•ObjectMessage

•MapMessage

Rodzaje wiadomości

Page 48: Silesia JUG : Java Message Service

• JMSDestination• JMSDeliveryMode•DeliveryMode.PERSISTENT

•DeliveryMode.NON_PERSISTENT

• JMSMessageID• JMSReplyTo• ...

Nagłówki

Page 49: Silesia JUG : Java Message Service

Właściwości

TextMessage message = pubSession.createTextMessage();message.setText(text);

message.setStringProperty("username",username);

publisher.publish(message);

Page 50: Silesia JUG : Java Message Service

A teraz trochę ciekawsze rzeczy...

Page 51: Silesia JUG : Java Message Service

• 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

Page 52: Silesia JUG : Java Message Service

• Używane przy modelu request-reply• JMSReplyTo

• Czasem przedstawiane jako anti-pattern

Kolejki tymczasowe

Page 53: Silesia JUG : Java Message Service

Demo Request-reply

Page 54: Silesia JUG : Java Message Service

• 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

Page 55: Silesia JUG : Java Message Service

Demo

Page 56: Silesia JUG : Java Message Service

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")

Page 57: Silesia JUG : Java Message Service

• 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

Page 58: Silesia JUG : Java Message Service

Pytania?

Page 59: Silesia JUG : Java Message Service

Źródła

• Java Message Service – O’Reilly• EJB3 – O’Reilly