Développement d'une application d'entreprise en vue de l'utilisation de beans gérés par messages (MDB)
Les applications peuvent utiliser des beans gérés par messages en tant que consommateurs de messages asynchrones. Vous déployez un bean géré par message comme un programme d'écoute de messages d'une destination. Le bean géré par messages est appelé par une spécification d'activation ou un programme d'écoute JMS lorsqu'un message arrive à la destination que ce programme d'écoute surveille.
Pourquoi et quand exécuter cette tâche
Le développement d'une application d'entreprise utilisant un bean géré par message est similaire au développement de tout autre bean enterprise, mais un bean géré par message n'a pas d'interface locale ou éloignée.
Vous devez développer un bean géré par message pour déléguer le processus de gestion des messages entrants à un autre bean enterprise, afin d'assurer une séparation claire entre le traitement des messages et le traitement métier. Cela signifie également que le traitement métier peut être appelé soit par l'arrivée de messages entrants, ou soit, par exemple, à partir d'un client WebSphere. Les réponses peuvent être gérées par un autre bean enterprise faisant office de bean émetteur ou dans le bean géré par messages.
Les beans gérés par messages EJB 2.0 ne prennent en charge que la messagerie JMS (Java™ Message Service). Les beans gérés par messages EJB 2.1 et EJB 3 peuvent aussi prendre en charge d'autres types de messageries. Tous les beans gérés par message doivent implémenter l'interface MessageDrivenBean. Pour la messagerie JMS, un bean géré par messages doit également implémenter l'interface du programme d'écoute de messages javax.jms.MessageListener. D'autres adaptateurs de ressources compatibles JCA (Java EE Connector Architecture) peuvent fournir leur propre interface d'écoute de messages à mettre en oeuvre.
Vous pouvez utiliser l'assistant New Enterprise Bean de Rational Application Developer pour créer un bean enterprise de type Bean géré par messages. L'assistant crée des méthodes adaptées au type de bean.
la classe
publique MyJMSppMDBBean met en oeuvre MessageDrivenBean, javax.jms.MessageListener
Un bean géré par message peut être connecté au service de délai EJB pour les notifications d'événements basés sur le temps s'il implémente aussi l'interface javax.ejb.TimedObject et la méthode d'appel de temporisateur void ejbTimeout(Timer). A l'heure planifiée, le conteneur appelle la méthode ejbTimeout du bean géré par message.
- onMessage(message), qui doit respecter les conditions
suivantes :
- La méthode doit avoir un seul argument de type javax.jms.Message.
- La clause throws ne doit pas définir des exceptions d'application.
- Si le bean géré par message est configuré pour utiliser les transactions gérées par bean, il doit appeler l'interface javax.transaction.UserTransaction pour définir la portée des transactions. Parce que ces appels se produisent à l'intérieur de la méthode onMessage(), la portée de la transaction n'inclut pas la réception du message initial. Pour plus d'informations, voir la rubrique relative au support de transaction des beans gérés par message.
Pour traiter le message à l'intérieur de la méthode onMessage() (par exemple, pour transmettre le message vers un autre bean enterprise), utilisez le JMS standard. Cette opération est appelée messagerie gérées par bean.
Si vous utilisez un adaptateur de ressources compatible JCA avec une interface d'écoute de messages différente, une autre méthode peut se révéler nécessaire en plus de la méthode onMessage(). Pour plus d'informations sur l'interface d'écoute de messages requise, voir la documentation fournie avec l'adaptateur de ressources compatible JCA.
- ejbCreate()
Vous devez définir et mettre en oeuvre une méthode ejbCreate pour chaque moyen par lequel vous souhaitez créer une nouvelle instance de bean enterprise.
- ejbRemove()
Cette méthode est appelée par le conteneur lorsqu'un client appelle la méthode "remove" dont hérite l'interface locale du bean enterprise de l'interface javax.ejb.EJBHome. Cette méthode doit contenir le code que vous souhaitez exécuter avant qu'une instance de bean enterprise ne soit supprimée du conteneur (et que les données associées ne soient supprimées de la source de données).
- ejbTimeout(Timer)
Cette méthode n'est nécessaire que pour la prise en charge des notifications provenant du service temporisateur, et contient la logique métier qui traite les événements basés sur le temps reçus.
Procédure
Résultats
Exemple
L'exemple suivant montre comment créer la classe de beans gérés par message. L'extrait de code suivant montre comment accéder au texte et au JMS MessageID, à partir d'un message JMS de type TextMessage. Dans cet exemple, tout d'abord, la méthode onMessage() d'un bean géré par message décomprime le message texte entrant et extrait le texte et l'identificateur de message, puis appelle une méthode putMessage privée (définie dans la même classe de bean message) pour placer le message dans une autre file d'attente:
public void onMessage(javax.jms.Message msg)
{
String text = null;
String messageID = null;
try
{
text = ((TextMessage)msg).getText();
System.out.println("senderBean.onMessage(), msg text2: "+text);
//
// store the message id to use as the Correlator value
//
messageID = msg.getJMSMessageID();
// Call a private method to put the message onto another queue
putMessage(messageID, text);
}
catch (Exception err)
{
err.printStackTrace();
}
return;
}