SlideShare a Scribd company logo
1 of 59
Download to read offline
Java Message Service
      Marek 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
Cechy JMS


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


1.Wiadomość zostawiamy w kanale
2.Możemy robić coś innego
3.Zostajemy (lub nie) poinformowani o zakończeniu
 procesu przetwarzania żądania
Niezawodność



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


    Queue
Skalowalność


    Queue
Skalowalność


    Queue
Architektury messagingu



• Centralna
• Rozproszona
Architektura centralna
Architektura rozproszona

             Router
Modele przesyłania wiadomości



• Point-to-point
• Publish-and-subscribe
Kilka terminów aby zamieszać
• application
 • client
   • consumer
    • receiver (P2P)
    • subscriber (Pub-sub)
   • producer
    • sender (P2P)
    • publisher (Pub-sub)
• provider – JMS service
Point-to-point


                          Receiver
Sender        Queue
                          Receiver
Point-to-point
• 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
Demo P2P
Publish-and-subscribe


                         Subscriber
Publisher      Topic
                         Subscriber
Publish-and-subscribe

• 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
Demo Pub-sub
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ści
                                                                    Specyficzne dla JBoss AS
  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");
                                                                                            1
context = new InitialContext(p);
connectionFactory = (ConnectionFactory) context.lookup("/ConnectionFactory");               2
QueueConnection queueConnection = (QueueConnection) connectionFactory.createConnection();   3
QueueSession queueSession = queueConnection.createQueueSession(false,
	 Session.AUTO_ACKNOWLEDGE);                                                                4
Queue queue = (Queue) context.lookup("queue/SimpleQueue");
                                                                                            5
QueueSender queueSender = queueSession.createSender(queue);
                                                                                            6
for (int i = 0; i <= 20; i++) {
	 String text = i + ", data: " + new Date();
	 System.out.println("Wysyłam: " + text);

	 TextMessage message = queueSession.createTextMessage(text);                               7
	 queueSender.send(message);
}                                                                                           8
queueConnection.close();
                                                                                            9
Składniki wiadomości


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

•StreamMessage
•ByteMessage

•TextMessage
•ObjectMessage
•MapMessage
Nagłówki

• JMSDestination
• JMSDeliveryMode
 •DeliveryMode.PERSISTENT
 •DeliveryMode.NON_PERSISTENT
• JMSMessageID
• JMSReplyTo
• ...
Właściwości


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

message.setStringProperty("username",username);

publisher.publish(message);
A teraz trochę ciekawsze rzeczy...
QueueBrowser

• 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
Kolejki tymczasowe


• Używane przy modelu request-reply
 • JMSReplyTo
• Czasem przedstawiane jako anti-pattern
Demo Request-reply
Filtrowanie wiadomości

• 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
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")
O czym nie mówiłem
• Transakcje
 • potwierdzenia wiadomości
  • ponowne wysyłanie
• Kolejki dla martwych wiadomości
• Grupowanie wiadomości
• Zasada działania MDB
• Bezpieczeństwo
• ...
Pytania?
Źródła



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

More Related Content

Viewers also liked

BoxGrinder – FOSDEM 2012
BoxGrinder – FOSDEM 2012BoxGrinder – FOSDEM 2012
BoxGrinder – FOSDEM 2012marekgoldmann
 
Java Night 2010 SteamCannon
Java Night 2010 SteamCannonJava Night 2010 SteamCannon
Java Night 2010 SteamCannonmarekgoldmann
 
JUDCon 2010 Boston : BoxGrinder
JUDCon 2010 Boston : BoxGrinderJUDCon 2010 Boston : BoxGrinder
JUDCon 2010 Boston : BoxGrindermarekgoldmann
 
TorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachTorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachmarekgoldmann
 
TorqueBox - moc Javy, piękno Rubiego
TorqueBox - moc Javy, piękno RubiegoTorqueBox - moc Javy, piękno Rubiego
TorqueBox - moc Javy, piękno Rubiegomarekgoldmann
 
BoxGrinder – FUDCon 2011 Tempe
BoxGrinder – FUDCon 2011 TempeBoxGrinder – FUDCon 2011 Tempe
BoxGrinder – FUDCon 2011 Tempemarekgoldmann
 
13 14 SAP policy - revised for spring 2014 - final - 111413
13 14 SAP policy - revised for spring 2014 - final  - 11141313 14 SAP policy - revised for spring 2014 - final  - 111413
13 14 SAP policy - revised for spring 2014 - final - 111413Houston Community College
 
Tutorial caesars II
Tutorial caesars IITutorial caesars II
Tutorial caesars IImanuedlf
 

Viewers also liked (8)

BoxGrinder – FOSDEM 2012
BoxGrinder – FOSDEM 2012BoxGrinder – FOSDEM 2012
BoxGrinder – FOSDEM 2012
 
Java Night 2010 SteamCannon
Java Night 2010 SteamCannonJava Night 2010 SteamCannon
Java Night 2010 SteamCannon
 
JUDCon 2010 Boston : BoxGrinder
JUDCon 2010 Boston : BoxGrinderJUDCon 2010 Boston : BoxGrinder
JUDCon 2010 Boston : BoxGrinder
 
TorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachTorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydach
 
TorqueBox - moc Javy, piękno Rubiego
TorqueBox - moc Javy, piękno RubiegoTorqueBox - moc Javy, piękno Rubiego
TorqueBox - moc Javy, piękno Rubiego
 
BoxGrinder – FUDCon 2011 Tempe
BoxGrinder – FUDCon 2011 TempeBoxGrinder – FUDCon 2011 Tempe
BoxGrinder – FUDCon 2011 Tempe
 
13 14 SAP policy - revised for spring 2014 - final - 111413
13 14 SAP policy - revised for spring 2014 - final  - 11141313 14 SAP policy - revised for spring 2014 - final  - 111413
13 14 SAP policy - revised for spring 2014 - final - 111413
 
Tutorial caesars II
Tutorial caesars IITutorial caesars II
Tutorial caesars II
 

Similar to Silesia JUG : Java Message Service

Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Cloudskraqa
 
Kamil Wysocki - Jak zrobić bramkę zdolną przyjąć miliony danych i nie strzeli...
Kamil Wysocki - Jak zrobić bramkę zdolną przyjąć miliony danych i nie strzeli...Kamil Wysocki - Jak zrobić bramkę zdolną przyjąć miliony danych i nie strzeli...
Kamil Wysocki - Jak zrobić bramkę zdolną przyjąć miliony danych i nie strzeli...PROIDEA
 
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?The Software House
 
Środowisko testowe pod REST-a
Środowisko testowe pod REST-aŚrodowisko testowe pod REST-a
Środowisko testowe pod REST-aFuture Processing
 
Webinar - Podstawy Node.js
Webinar - Podstawy Node.jsWebinar - Podstawy Node.js
Webinar - Podstawy Node.jsWojciech Kaniuka
 
Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2Natalia Stanko
 
DynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornychDynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornychThe Software House
 
WebView security on iOS (PL)
WebView security on iOS (PL)WebView security on iOS (PL)
WebView security on iOS (PL)lpilorz
 
4Developers 2015: Frameworki jee vs cross-site scripting (xss) - Piotr Bucki
4Developers 2015: Frameworki jee vs cross-site scripting (xss) - Piotr Bucki4Developers 2015: Frameworki jee vs cross-site scripting (xss) - Piotr Bucki
4Developers 2015: Frameworki jee vs cross-site scripting (xss) - Piotr BuckiPROIDEA
 
Jak oszczędzać czas zespołu w środowisku mikroserwisów, czyli efektywny flow ...
Jak oszczędzać czas zespołu w środowisku mikroserwisów, czyli efektywny flow ...Jak oszczędzać czas zespołu w środowisku mikroserwisów, czyli efektywny flow ...
Jak oszczędzać czas zespołu w środowisku mikroserwisów, czyli efektywny flow ...Mateusz Paprocki, PMP
 
Websites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUGWebsites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUGBart Zaremba
 
Smx + Camel - Maciek Próchniak
Smx + Camel - Maciek PróchniakSmx + Camel - Maciek Próchniak
Smx + Camel - Maciek PróchniakMaciek Próchniak
 
Architektura serwera gier online
Architektura serwera gier onlineArchitektura serwera gier online
Architektura serwera gier onlineMaciej Mróz
 
Nowości w zakresie bezpieczeństwa w SQL Server 2016
Nowości w zakresie bezpieczeństwa w SQL Server 2016Nowości w zakresie bezpieczeństwa w SQL Server 2016
Nowości w zakresie bezpieczeństwa w SQL Server 2016Kamil Nowinski
 
Azure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieAzure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieVimanet
 
Azure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieAzure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieŁukasz Bargieł
 

Similar to Silesia JUG : Java Message Service (20)

Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Kamil Wysocki - Jak zrobić bramkę zdolną przyjąć miliony danych i nie strzeli...
Kamil Wysocki - Jak zrobić bramkę zdolną przyjąć miliony danych i nie strzeli...Kamil Wysocki - Jak zrobić bramkę zdolną przyjąć miliony danych i nie strzeli...
Kamil Wysocki - Jak zrobić bramkę zdolną przyjąć miliony danych i nie strzeli...
 
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Środowisko testowe pod REST-a
Środowisko testowe pod REST-aŚrodowisko testowe pod REST-a
Środowisko testowe pod REST-a
 
Webinar - Podstawy Node.js
Webinar - Podstawy Node.jsWebinar - Podstawy Node.js
Webinar - Podstawy Node.js
 
Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2
 
DynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornychDynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornych
 
WebView security on iOS (PL)
WebView security on iOS (PL)WebView security on iOS (PL)
WebView security on iOS (PL)
 
4Developers 2015: Frameworki jee vs cross-site scripting (xss) - Piotr Bucki
4Developers 2015: Frameworki jee vs cross-site scripting (xss) - Piotr Bucki4Developers 2015: Frameworki jee vs cross-site scripting (xss) - Piotr Bucki
4Developers 2015: Frameworki jee vs cross-site scripting (xss) - Piotr Bucki
 
Jak oszczędzać czas zespołu w środowisku mikroserwisów, czyli efektywny flow ...
Jak oszczędzać czas zespołu w środowisku mikroserwisów, czyli efektywny flow ...Jak oszczędzać czas zespołu w środowisku mikroserwisów, czyli efektywny flow ...
Jak oszczędzać czas zespołu w środowisku mikroserwisów, czyli efektywny flow ...
 
Torquebox
TorqueboxTorquebox
Torquebox
 
Android i REST
Android i RESTAndroid i REST
Android i REST
 
Websites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUGWebsites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUG
 
Smx + Camel - Maciek Próchniak
Smx + Camel - Maciek PróchniakSmx + Camel - Maciek Próchniak
Smx + Camel - Maciek Próchniak
 
Architektura serwera gier online
Architektura serwera gier onlineArchitektura serwera gier online
Architektura serwera gier online
 
Nowości w zakresie bezpieczeństwa w SQL Server 2016
Nowości w zakresie bezpieczeństwa w SQL Server 2016Nowości w zakresie bezpieczeństwa w SQL Server 2016
Nowości w zakresie bezpieczeństwa w SQL Server 2016
 
Azure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieAzure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenie
 
Azure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieAzure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenie
 
O danych w 2016
O danych w 2016O danych w 2016
O danych w 2016
 

Silesia JUG : Java Message Service