Fiches / Articles

Cadre Fonctionnel

Développement d’un MDB (Message-Driven Bean)

Cadre Technique

NT / JMS

Identifiant 

JMS_EJB_02

Référent technique 


Version 

1.0

Auteur 

Alexandre Brillant

Date 

04/01

Source

http://java.sun.com/products/jms/tutorial/html/j2eeapp.htmll

Cibles 

JMS_EJB_01

Dépendance 


La réception asynchrone des messages n’est pas possible avec l’implémentation EJB/1.1. Il est nécessaire de disposer d’un serveur supportant EJB/2.0. Dans ce dernier cas, la partie de traitement des messages doit faire intervenir un nouveau type de bean : Message-Driven Bean (MDB).


Dans ce schéma, trois niveaux de communication existent. Le premier concernant l’espace client n’a pas de connaissance particulière d’un moyen de communication. Le deuxième concerne le support de communication à base de messages déposés dans un « topic ». Le troisième est l’espace des traitements grâce aux session beans et MDB.

Le client commence par obtenir un accès à un EJB. Ce dernier se charge de transmettre grâce à une implémentation JMS un ensemble de messages. Enfin en dernière étape un composant MDB récèptionne le ou les messages. L’ensemble de ces opérations nécéssite un accès JNDI (Java Naming and Directory Interfaces).

Exemple d’un MDB :


import java.io.Serializable;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.ejb.CreateException;
import javax.naming.*;
import java.jms.*;

/**
 * Il est nécessaire d'utiliser un Serveur EJB conforme aux
spécifications 2.0
 * Exemple de MDB : Lorsque le message reçu est de type
TextMessage, 
 * le contenu ou un message d'erreur pour un type différent
est affiché. 

 */

public class MessageBean implements MessageDrivenBean,
MessageListener {

    private transient MessageDrivenContext mdc = null;

    private Context context;

    public MessageBean() {}

    public void setMessageDrivenContext( MessageDrivenContext mdc ) {
	this.mdc = mdc;
    }

    public void ejbCreate() {}

    /**
     * Récèption asynchrone d'un message
     */
    public void onMessage( Message inMessage ) {

	try {

	    // Le format du message est connu
	    if ( inMessage instanceof TextMessage ) {
		msg = (TextMessage)inMessage;
		System.out.println( "Message : " + msg.getText() );

	    } else {
		System.out.println( "Message de type inconnu :" +
inMessage.getMessage() );

	    }

	} catch( JMSException e ) {
	    e.printStackTrace();
	    mdc.setRollbackOnly();
	}

    }

    public void ejbRemove() {}

}