Mai 10th, 2006

MessageDrivenBeans auf EJB3 Manier

Posted by frank in Java, J2EE

Sinn und Zweck von MessageDrivenBeans (MDB) ist es Nachrichten asynchron abzuarbeiten. Dazu schickt ein Client, wie z.B. ein SessionBean oder ein Servlet, eine Nachricht in eine Queue und diese verarbeitet dann Nacheinander oder mit Hilfe eines Threadpools auch parallel die Nachrichten. Dazu werden die Nachrichten an ein MDB übergeben und dieses Bean verarbeitet dies dann.
Wir benötigen also ein MDB, welches an eine Queue gehangen wird um die Nachrichten entgegen zu nehmen. Dazu erzeugen wir uns einfach eine Klasse und implementieren dazu noch das Interface MessageListener. Mit Hilfe der Annotations @MessageDriven deklarieren wir diese Klasse als MDB. Das Ganze könnte dann ungefähr so aussehen:

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;

import javax.jms.JMSException;
import javax.jms.Message;

import javax.jms.MessageListener;

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = “destinationType”, propertyValue = “javax.jms.Queue”),
        @ActivationConfigProperty(propertyName = “destination”, propertyValue = “queue/A”) })

public class MessageDrivenTest implements MessageListener {
    public void onMessage(Message message) {
        System.out.println(“*********** RECEIVE MESSAGE **********”);
    }
}

Bei der Annotation MessageDriven definieren wir mit den Parametern ActivationConfig die Queue-Art wo wir uns anhängen und natürlich den Namen (JNDI-Namen), wo die Queue zu finden ist. Falls es keine Queue mit diesem Namen gibt, so legt uns JBoss beim Deployment automatisch eine entsprechende Queue an. Es sollte jedoch im Produktionsbetrieb die Queue weiter Konfiguriert werden, vor allem bezüglich Zugriffssicherheit und Persistenz. Dazu steht die Konfigurationsdatei deploy/jms/jbossmq-destinations-service.xml zur Verfügung.
Der Versand von Nachrichten erfolgt dann durch Verbinden zu der Queue und das entsprechende Absenden einer Nachricht.

import javax.jms.Queue;
import javax.jms.QueueConnection;

import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;

import javax.jms.QueueSession;
import javax.jms.TextMessage;

import javax.naming.InitialContext;
import javax.naming.NamingException;

private void sendJMSMessage() {
    Queue queue;
    QueueConnection cnn;
    QueueSession sess;
    try {
        InitialContext ctx = new InitialContext();
        queue = (Queue) ctx.lookup(“queue/A”);
        QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup(“ConnectionFactory”);
        cnn = factory.createQueueConnection();
        sess = cnn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
        TextMessage msg = sess.createTextMessage(“Some Text”);
        QueueSender sender = sess.createSender(queue);
        sender.send(msg);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

3 Responses to ' MessageDrivenBeans auf EJB3 Manier '

Subscribe to comments with RSS or TrackBack to ' MessageDrivenBeans auf EJB3 Manier '.

  1. Broesel said,

    on April 21st, 2009 at 8:25 am

    Hallo,
    bin gerade dabei meine ersten Gehversuche mit JBoss zu machen und habe ein ähnliches Beispiel ausprobiert.

    Beim Deployen des MDB bekomme ich allerdings immer “javax.naming.NameNotFoundException: mdb not bound” wobei destination in den annotations mit “queue/mdb” definiert ist. Muß das MDB noch in irgendwelchen Config-Dateien definiert werden?

  2. frank said,

    on April 21st, 2009 at 9:45 am

    Richtig, diese müssen noch definiert werden. Dazu steht, wie geschrieben, die Datei deploy/jms/jbossmq-destinations-service.xml zur Verfügung. In Clusterumgebungen auch deploy-hasingleton/jms/jbossmq-destinations-service.xml. Es kann sein, dass unter Jboss 5 die Datei jetzt anders heißt.
    Alternativ zur globalen Konfiguration kann man auch eine Service-Datei mit in die EAR einbinden und dort die MessageQueue definieren.

  3. vincent said,

    on September 5th, 2010 at 11:55 am

    die Queue: “queue/mdb” kannst du einfach über die admin-konsole von JBoss manuell eintragen. Dabei gibst du dann einfach als JNDI_Namen: “queue/mdb” an. Dann sollte die Queue für den Container auch bekannt sein.

Leave a reply

:mrgreen: :neutral: :twisted: :shock: :smile: :???: :cool: :evil: :grin: :oops: :razz: :roll: :wink: :cry: :eek: :lol: :mad: :sad: