Top Banner
Java Message Service Marek Goldmann Silesia JUG
59

Silesia JUG : Java Message Service

Apr 22, 2015

Download

Technology

marekgoldmann

Wprowadzenie do Java Message Service zaprezentowane na spotkaniu Silesia JUG 15.06.2010 przez Marka Goldmanna.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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