Archiwum

Posts Tagged ‘Message Broker’

JMS tutorial – krótkie wprowadzenie

7 grudnia 2009 90 Komentarzy

JMS (Java Message Service) każdy wie co to jest 😉 a jak nie to warto sprawdzić w wikipedii 🙂
JMS wspiera dwa typy komunikatów (messaging models).
W każdym mamy klienta [message consumer] i dostawcę [message procuder].
Te typy to:
1. Point to point [czyli jeden do jednego] – komunikaty są wysyłane przez kolejki [queues] – tutaj dostawcę nazywamy producer, a klienta receiver
2. Publish and subscribe [czyli jeden do wielu] – komunikaty są wysyłane to kanału [topic] – tutaj dostawcę nazywamy publisher a klienta subscriber

W obu przypadkach komunikaty mogą być wysyłane synchronicznie jak i asynchronicznie.

JMS API podzielone jest na trzy części
API ogólne(?) tzn:
ConnectionFactory
Destination
Connection
Session
Message
MessageProducer
MessageConsumer

Point to point:
QueueConnectionFactory
Queue
QueueConnection
QueueSession
Message
QueueSender
QueueReceiver

Publish and subscribe:
TopicConnectionFactory
Topic
TopicConnection
TopicSession
Message
TopicPublisher
TopicSubscriber

Spośród dostępnych implementacji JMS wybrałem ActiveMQ [to tzw „message broker”] – wersję 5.3 można pobrać tutaj

Uruchomienie ActiveMQ jest bardzo proste, wystarczy rozpakować pobrane archiwum i w katalogu bin, z konsoli wywołać polecenie

./activemq

w konsoli podczas uruchamiania mniej więcej pojawia się coś takiego

 INFO | Using Persistence Adapter: org.apache.activemq.store.kahadb.KahaDBPersistenceAdapter@26a7dd39
 INFO | Replayed 1 operations from the journal in 0.016 seconds.
 INFO | ActiveMQ 5.3.0 JMS Message Broker (localhost) is starting
 INFO | For help or more information please see: http://activemq.apache.org/
 INFO | Listening for connections at: tcp://enigma-ubu:61616
 INFO | Connector openwire Started
 INFO | ActiveMQ JMS Message Broker (localhost, ID:enigma-ubu-40003-1260214060614-0:0) started
 INFO | Logging to org.slf4j.impl.JCLLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
 INFO | jetty-6.1.9
 INFO | ActiveMQ WebConsole initialized.
 INFO | Initializing Spring FrameworkServlet 'dispatcher'
 INFO | ActiveMQ Console at http://0.0.0.0:8161/admin
 INFO | Initializing Spring root WebApplicationContext
 INFO | Connector vm://localhost Started
 INFO | Camel Console at http://0.0.0.0:8161/camel
 INFO | ActiveMQ Web Demos at http://0.0.0.0:8161/demo
 INFO | RESTful file access application at http://0.0.0.0:8161/fileserver
 INFO | Started SelectChannelConnector@0.0.0.0:8161

teraz w przeglądarce można sprawdzić adres http://localhost:8161/admin/index.jsp


Czas na przykładową aplikację, korzystającą z ogólnego API. Aplikacja będzie bardzo prosta, tylko wyśle jeden komunikat.
Tworzymy nowy projekt Java -> Java Application
Następnie do bibliotek dodajemy plik activemq-all-5.3.0.jar [znajduje się w pobranym archiwum]

Tworzymy klasę i taki kod:

import javax.jms.*;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Main {

    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL; //1
    private static String subject = "test";

    public static void main(String[] args) {
        try {
            ConnectionFactory conncectionFactory = new ActiveMQConnectionFactory(url);
            Connection connection = conncectionFactory.createConnection();
            connection.start();

            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //2
            Destination destination = session.createQueue(subject);
            MessageProducer producer = session.createProducer(destination);

            TextMessage message = session.createTextMessage("hej to testowa wiadomosc");
            producer.send(message);
	    connection.close();
        } catch (JMSException ex) {
            ex.printStackTrace();
        }
    }
}

(1) ActiveMQConnection.DEFAULT_BROKER_URL oznacza że „message broker” działa na localhost
(2) funcka createSession ma dwa parametry, pierwszy czy połączenie będzie transakcyjne bądź nie, a drugi parametr wskazuje kiedy jest wysyłana wiadomość potwierdzająca otrzymanie komunikatu. Session.AUTO_ACKNOWLEDGE oznacza że potwierdzenie jest wysyłane automatycznie po otrzymaniu komunikatu. Reszta kodu wydaje się oczywista.

Po uruchomieniu aplikacji można wejść w zakładkę Queues, gdzie widać wysłane do komunikaty



a w zakładce Connections widzimy podpiętych klientów.


To wszystko. Przykład jest banalny, ale od czegoś trzeba zacząć 🙂 W następnym wpisie postaram się pokazać przykład wykorzystujący komunikację „Publish and subscribe”, albo „Point to point”. A może oba typy.

Reklamy
Kategorie:JMS Tagi: , ,