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 sys...
Integracja

                               ?
• Dane zawsze będą
  wymieniane pomiędzy
  systemami
 • Najczęściej różne jęz...
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 fun...
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ńcz...
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)
   • pr...
Point-to-point


                          Receiver
Sender        Queue
                          Receiver
Point-to-point
• Wysyłanie asynchronicznych i synchronicznych
  wiadomości za pomocą kolejek
• Wiadomość wysłana do kolejk...
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 p...
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.NamingC...
Wysyłanie wiadomości
                                                                    Specyficzne dla JBoss AS
  Propert...
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
• JMSR...
Właściwości


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

message.setStringProperty("use...
A teraz trochę ciekawsze rzeczy...
QueueBrowser

• Przeglądanie wiadomości z kolejki bez ich
  pobierania
• Pracuje na kopiach wiadomości, które
  znajdowały...
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 koleje...
Demo
Tworzenie filtrów w kodzie

public QueueReceiver createReceiver(Queue queue, String
messageSelector)

public TopicSubscrib...
O czym nie mówiłem
• Transakcje
 • potwierdzenia wiadomości
  • ponowne wysyłanie
• Kolejki dla martwych wiadomości
• Grup...
Pytania?
Źródła



• Java Message Service – O’Reilly
• EJB3 – O’Reilly
Upcoming SlideShare
Loading in …5
×

Silesia JUG : Java Message Service

1,950 views
1,858 views

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,950
On SlideShare
0
From Embeds
0
Number of Embeds
528
Actions
Shares
0
Downloads
12
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Silesia JUG : Java Message Service

  1. 1. Java Message Service Marek Goldmann Silesia JUG
  2. 2. Agenda • Zastosowanie JMS • Podstawy • Terminy • Architektury i modele • ...przeplatane demkami
  3. 3. JMS!? Po co to nam?
  4. 4. Integracja
  5. 5. ...ale nie tylko!
  6. 6. Zastosowania JMS • SOA • Event-driven architecture • B2B • Rozgłaszanie informacji (broadcast) • Budowa rozproszonych systemów
  7. 7. Integracja ? • Dane zawsze będą wymieniane pomiędzy systemami • Najczęściej różne języki
  8. 8. Sposoby wymiany danych • RPC • FTP • Webservice/REST • Współdzielenie bazy danych • Zdarzenia
  9. 9. ...i powody, dla których nie powinniśmy ich wybierać
  10. 10. Remote Procedure Call?
  11. 11. Remote Procedure Call? • Przywiązanie do interfejsu i jego lokalizacji • Synchroniczne zapytania • Trudno dodać nowe funkcjonalności
  12. 12. File Transfer Protocol?
  13. 13. File Transfer Protocol? • Kodowanie plików • Bezpieczeństwo • Konwencje
  14. 14. Webservice/REST
  15. 15. Webservice/REST • Niezawodność
  16. 16. Współdzielenie bazy danych
  17. 17. Współdzielenie bazy danych • Naprawdę ktoś wymyślił coś takiego?!?
  18. 18. I tutaj dochodzimy do architektury zdarzeniowej
  19. 19. Nie! Nie jest ona pozbawiona wad!
  20. 20. Wady architektury zdarzeniowej • Złożony model programistyczny • Kolejność wiadomości • Monitorowanie?
  21. 21. Czy model zdarzeniowy to to samo co przesyłanie wiadomości?
  22. 22. Nie do końca
  23. 23. Model zdarzeniowy oparty jest na przesyłaniu wiadomości
  24. 24. OK, wróćmy do JMS
  25. 25. Cechy JMS • Asynchroniczność • Niezawodność • Skalowalność
  26. 26. Asynchroniczność 1.Wiadomość zostawiamy w kanale 2.Możemy robić coś innego 3.Zostajemy (lub nie) poinformowani o zakończeniu procesu przetwarzania żądania
  27. 27. Niezawodność • Wiadomości w kanale są przechowywane nawet w przypadku awarii (restartu) serwera JMS
  28. 28. Skalowalność Queue
  29. 29. Skalowalność Queue
  30. 30. Skalowalność Queue
  31. 31. Architektury messagingu • Centralna • Rozproszona
  32. 32. Architektura centralna
  33. 33. Architektura rozproszona Router
  34. 34. Modele przesyłania wiadomości • Point-to-point • Publish-and-subscribe
  35. 35. Kilka terminów aby zamieszać • application • client • consumer • receiver (P2P) • subscriber (Pub-sub) • producer • sender (P2P) • publisher (Pub-sub) • provider – JMS service
  36. 36. Point-to-point Receiver Sender Queue Receiver
  37. 37. 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
  38. 38. Point-to-point • Modele wysyłania wiadomości • Fire and forget • Request/Reply • Model odbierania wiadomości • Pull
  39. 39. Demo P2P
  40. 40. Publish-and-subscribe Subscriber Publisher Topic Subscriber
  41. 41. 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
  42. 42. Publish-and-subscribe • Modele wysyłania wiadomości • Fire and forget • Model odbierania wiadomości • Push
  43. 43. Demo Pub-sub
  44. 44. 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();
  45. 45. 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
  46. 46. Składniki wiadomości • Nagłówki • Właściwości • Dane
  47. 47. Rodzaje wiadomości •StreamMessage •ByteMessage •TextMessage •ObjectMessage •MapMessage
  48. 48. Nagłówki • JMSDestination • JMSDeliveryMode •DeliveryMode.PERSISTENT •DeliveryMode.NON_PERSISTENT • JMSMessageID • JMSReplyTo • ...
  49. 49. Właściwości TextMessage message = pubSession.createTextMessage(); message.setText(text); message.setStringProperty("username",username); publisher.publish(message);
  50. 50. A teraz trochę ciekawsze rzeczy...
  51. 51. 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
  52. 52. Kolejki tymczasowe • Używane przy modelu request-reply • JMSReplyTo • Czasem przedstawiane jako anti-pattern
  53. 53. Demo Request-reply
  54. 54. 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
  55. 55. Demo
  56. 56. 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")
  57. 57. 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 • ...
  58. 58. Pytania?
  59. 59. Źródła • Java Message Service – O’Reilly • EJB3 – O’Reilly

×