JMS Tutorial

Den Java Message Service Schritt für Schritt erklärt

In diesem Tutorial zum Java Message Service (JMS) findet man die grundlegenden Befehle zum Senden und Empfangen von Nachrichten mit einer kleinen Java-Anwendung. Damit dies funktioniert, muss die verwendete Java-Entwicklung eingerichtet sein. Es muss also ein WebServer wie Glassfish oder JBoss laufen, der JMS zu Verfügung stellt. Grundsätzlich wird darüber hinaus die Java Enterprise Edition (Jave EE) zur Entwicklung genutzt.

Wie man in unserem theoretischen Teil von JMS lesen kann, müssen erst verschiedene Schritte realisiert werden, bevor man die ersten Nachrichten verschickt und empfangen werden können. Wer den Artikel noch nicht gelesen hat, sollte dies auf jeden Fall nachholen, um das Grundprinzip rund um JMS verstanden zu haben.

Nun geht es aber auch schon los. In diesem JMS Tutorial werdend die Schritte einzeln vorgestellt und erklärt.

1.) JMS Connection Factories

Mit Hilfe der Connection Factory kann ein der Client eine Verbindung (Connection) zu einem Provider erstellen. Eine Connection Factory ist ein Object, das einige Verbindungskonfigurationsparameter beinhaltet. Dabei ist jede Connection Factory eine Instanz von ConnectionFactory, QueueConnectionFactory oder TopicConnectionFactory.

Zu Beginn eines JMS Client-Programms wird eine Connection Factory Ressource in ein ConnectionFactory Objekt injiziert.

Dafür erstellt man erst einmal einen InitialContext, diesem können auf diesem Weg gleich Eigenschaften, die für den Verbindungsaufbau zum Webserver wichtig sind, mitgegeben werden. Mit Hilfe des InitialContext kann anschließend ein Lookup auf JNDI Context nach ConnectionFactory ausgeführt werden.


Properties p = new Properties();
[HIER KÖNNEN NUN EIGENSCHAFTEN DEFINIERT WERDEN]
Context context = new InitialContext(p); //Wahlweise auch einfach nur new InitialContext()
ConnectionFactory connectionFactory = (ConnectionFactory) context
					.lookup("jms/RemoteConnectionFactory");

2.) JMS Connection

Eine Connection verkapselt eine virtuelle Verbindung mit einem JMS Provider. Mit einer Connection kann man eine oder mehrere Sessions erstellen. Um eine Connection selbst erstellen zu können, braucht man erst eine ConnectionFactory.


Connection connection = connectionFactory.createConnection();

Man sollte nie vergessen die Connection am Ende des Programms, bzw. an einer anderen beliebigen Stelle wieder zu schließen:


connection.close();

3.) Sessions

Als letztes Bindeglied um Messages erstellen, versenden und empfangen zu können, fehlen noch Sessions.


Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

Der obere Code erzeugt eine neue Session, wobei das erste Argument bei createSession besagt, dass die Session nicht transacted sein soll, während das zweite Argument bedeutet, dass die Session automatisch eingehende Nachrichten annehmen soll.

4.) Message

Bevor eine Message verschickt werden kann, muss sie erst einmal erstellt werden. Eine Message setzt sich aus den drei Teilen: Header, Properties und Body zusammen. Wobei nur der Header verpflichtend ist. Dieser enthält nämlich Informationen damit die Nachricht von Client und Provider identifiziert und weitervermittelt werden kann. Insgesamt gibt es fünf verschiedenen Message-Arten, die durch ihre Body-Formate unterschieden werden. Dazu gehören:

  • TextMessage
  • MapMessage
  • BytesMessage
  • StreamMessage
  • ObjectMessage

Eine Textmessage würde man beispielsweise folgendermaßen erzeugen:


TextMessage message = session.createTextMessage();
message.setText(“Dies ist der Nachrichtentext“);

5.) Message Producer

Mit einem Message Producer können Nachrichten versendet werden. Als Übergabeparameter gibt man die Queue/Topic an, an die die Nachricht geschickt werden soll.


MessageProducer producer = session.createProducer(queue); //oder statt queue topic
producer.send(message);

6.) Message Consumer

Mit einem Message Consumer können Nachrichten empfangen werden. Abgerufen werden können die Messages aus einer Destination, Queue oder Topic.


MessageConsumer messageConsumer = session.createConsumer(queue);
connection.start();
Message m = consumer.receive(10000);

Im oberen Codebeispiel liegt ein synchroner Empfang vor. Nach 10.000 Millisekunden gibt es ein TimeOut und keine Nachrichten werden empfangen. Möchte man eine asynchrone Empfang, dann muss man auf einen message listener zurückgreifen:


MessageListener listener = new MyMessageListener();
messageConsumer.setMessageListener(listener);

In der onMessage-Methode wird dann definiert, was getan werden soll, wenn eine Message empfangen wird. Diese Methode wird nämlich automatisch vom JMS Proivder aufgerufen. Als Übergabeparameter erhält man dabei eine Message, die dann wiederum in der Methode in die anderen Message-Types gecastet werden kann.