Message Driven Bean - BENELALLAM

Post on 17-Nov-2021

5 views 1 download

Transcript of Message Driven Bean - BENELALLAM

Message Driven Bean

MessageDriven Bean:Définition

• Message-Drivenbeans =beans accessiblesparmessaging asynchrone• NouveautéapparueavecEJB2.0,• Messaging =moyendecommunicationléger,comparéàRMI-IIOP,• Pratiquedansdenombreuxcas.

MessageDriven Bean:Casd’utilisation

UtiliserunMessageDriven Beansi:• LeBeandoitêtreexécutélorsqu’unmessageestarrivé.

• Lemessagedoitêtretraitéd’unemanièreasynchrone.

MessageDriven Bean:Motivation

• Performance• UnclientRMI-IIOPattend pendantqueleserveureffectueletraitementd'unerequête,

• Fiabilité• Lorsqu'unclientRMI-IIOPparleavecunserveur,cedernierdoitêtreentraindefonctionner.S'ilcrashe,ousileréseaucrashe,leclientestcoincé.

• Pasdebroadcasting !• RMI-IIOPlimitelesliaisons1clientvers1serveur

Messaging

• C'estcommelemail!Oucommesionavaitunetroisièmeentitéentreleclientetleserveur!

Messaging

• MessageOriented Middleware(MOM)estlenomdonnéauxmiddlewaresquisupportentlemessaging.

• Tibco Rendezvous,IBMMQSeries,BEATuxedo/Q,MicrosoftMSMQ,Talarian SmartSockets,ProgressSonicMQ,Fiorano FioranoMQ,…

• Cesproduitsfournissent:messagesavecgarantiedelivraison,toléranceauxfautes,load-balancing desdestinations,etc…

TheJavaMessageService(JMS)

• LesserveursMOMsontpourlaplupartpropriétaires:pasdeportabilitédesapplications!

• JMS=unstandardpournormaliserleséchangesentrecomposantetserveurMOM,

• UneAPIpourledéveloppeur,• UnServiceProviderInterface(SPI),pourrendreconnecterl'APIetlesserveursMOM,vialesdriversJMS

JMS:MessagingDomains• Avantdefairedumesaging,ilfautchoisirundomaine

• Domaine=typedemessaging

• Domainespossibles• Publish/Subscribe(pub/sub):nproducteurs,nconsommateurs(tv)

• PointToPoint(PTP):nproducteurs,1consommateur

JMS:lesétapes

1. Localiser ledriverJMS• lookup JNDI.Ledriverestuneconnection factory

2. Créeruneconnection JMS• obteniruneconnection àpartirdelaconnection

factory

3. Créerunesession JMS• Ils'agitd'unobjetquivaserviràrecevoiret

envoyerdesmessages.Onl'obtientàpartirdelaconnection.

4. Localiser ladestination JMS• Ils'agitducanal,delachaînetélé!Normalement,

c'estrégléparledéployeur.Onobtientladestination viaJNDI.

5. Créerunproducteur ouunconsommateur JMS• Utiliséspourécrireoulireunmessage.Onles

obtientàpartirdeladestination oudelasession.

6. Envoyer ourecevoir unmessage

JMS:lesinterfaces

JMS:exempledecode(1)

JMS:exempledecode(2)

Note : Dans 3) false = pas de transactions, AUTO_AKNOWLEDGE = inutile ici puisqu’on envoie des messages.

IntégrerJMSetlesEJB

• Pourquoicréerunnouveautyped'EJB?• Pourquoinepasavoirdéléguéletravailàunobjetspécialisé?• Pourquoinepasavoiraugmentélescaractéristiquesdessessionbeans?

• Parcequeainsionpeutbénéficierdetouslesavantagesdéjàrencontrés:cycledevie,pooling,descripteursspécialisés,codesimple…

Qu'est-cequ'unMessage-DrivenBean?

• UnEJBquipeutrecevoirdesmessages• Ilconsommedesmessagesdepuislesqueuesoutopics,envoyésparlesclientsJMS

Qu'est-cequ'unMessage-DrivenBean?

• Unclientn'accèdepasàunMDBviauneinterface,ilutilisel'APIJMS,• UnMDBn'apasd'interfaceHome,LocalHome,Remote ouLocal,• LesMDBpossèdentuneseuleméthode,faiblementtypée:onMessage()

• ElleaccepteunmessageJMS(BytesMessage,ObjectMessage,TextMessage,StreamMessage ouMapMessage)

• Pasdevérificationdetypesàlacompilation.• Utiliserinstanceof aurun-timepourconnaîtreletypedumessage.

• LesMDBn'ontpasdevaleurderetour• Ilssontdécouplésdesproducteurs demessages.

• LesMDBnerenvoientpasd'exceptionsauclient(maisaucontainer),• LesMDBsontstateless…

DévelopperunMessage-Driven Bean• LesMDBs doiventimplémenterpublic interface javax.jms.MessageListener {

public void onMessage(Message message);

}

public interface javax.ejb.MessageDrivenBean

extends EnterpriseBean {

public void ejbRemove()

throws EJBException;

public void setMessageDrivenContext(MessageDrivenContext ctx)

throws EJBException;

}

• Laclassed'implémentationdoitfourniruneméthodeejbCreate() quirenvoitvoid etquin'apasd'arguments.

DévelopperunMessage-Driven Bean

• Méthodesquidoiventêtreimplémentées• onMessage(Message)

• Invoquéeàchaqueconsommationdemessage• UnmessageparinstancedeMBD,poolingassuréparlecontainer

• setMessageDrivenContext(MessageDrivenContext)• AppeléeavantejbCreate,sertàrécupèrerlecontexte.• Necontientquedesméthodesliéesauxtransactions…

DévelopperunMessage-Driven Bean

Unexemplesimple

• UnMDBquifaitdulogging,c'estàdireaffichedesmessagesdetextesàl'écranchaquefoisqu'ilconsommeunmessage.

• Utilepourdébugger….

• Rappel:pasd'interfaces!

Laclassedubean

Laclassedubean(suite)

Question?

• Commentsait-onquellequeueouqueltopicdemessageslebeanconsomme?

• Celan'apparaîtpasdansledescripteur!

• C'estfaitexprèspourrendrelesMDBportablesetréutilisables.• L'informationsetrouvedansl’@ActivationConfigPropertyaudébutducode

Leclient(1)import javax.naming.*;

import javax.jms.*;

import java.util.*;

public class Client {

public static void main (String[] args) throws Exception {

// Initialize JNDI

Context ctx = new InitialContext(System.getProperties());

// 1: Lookup ConnectionFactory via JNDI

TopicConnectionFactory factory =

(TopicConnectionFactory)

ctx.lookup("javax.jms.TopicConnectionFactory");

// 2: Use ConnectionFactory to create JMS connection

TopicConnection connection =

factory.createTopicConnection();

Leclient(2)

// 3: Use Connection to create session

TopicSession session = connection.createTopicSession(

false, Session.AUTO_ACKNOWLEDGE);

// 4: Lookup Destination (topic) via JNDI

Topic topic = (Topic) ctx.lookup("testtopic");

// 5: Create a Message Producer

TopicPublisher publisher = session.createPublisher(topic);

// 6: Create a text message, and publish it

TextMessage msg = session.createTextMessage();

msg.setText("This is a test message.");

publisher.publish(msg);

}

}

MessageDriven Bean:Implémentation

• Considéronslacréationd’unbean quipermetd’extraireuntexteenvoyéparunclientpourqu’ilsoitutiliséparuneautreapplication.

• Pourcommencer,ilfaututiliserl’annotation@MessageDriven,enspécifiantletypedemessagequiserapriseencharge(jms/Queue)

MessageDriven Bean:Implémentation

• Parlasuiteondéfinituneclassepubliqueimplémentantl’interfaceMessageListener,quicontientlamethodeonMessage(Messagemsg)responsabledelalogiquemétier.

The JMS API Programming ModelThe basic building blocks of a JMS application consist of• Administered objects: connection factories and

destinations• Connections : A connection encapsulates a virtual

connection with a JMS provider.• Sessions : A session is a single-threaded context for

producing and consuming messages.• Message producers : A message producer is an object

that is created by a session and used for sendingmessages to a destination.

• Message consumers : message consumer is an objectthat is created by a session and used for receivingmessages sent to a destination.

• Messages : abasic formatthat is simplebuthighly flexible,allowing you tocreate messages that matchformatsused bynon-JMSapplications onheterogeneous platforms.

JMSMessagingModels

In publish-and-subscribe messaging, one producer cansend a message to many consumers through a virtualchannel called a topic.

The point-to-point messaging model allows JMS clients to send and receive messages both synchronously and asynchronously via virtual channels known as queues.

Retoursurlepackaging

• Unfichierd’archived’entreprise(EAR)• ModuleEJB(.jar)• Moduleweb(.war)• Applicationcliente(.jar)• Module‘ResourceAdapter’(.rar)• ....

• Chaquefichierd’archive(ear,war,raroujar)contientundescripteurdedéploiement(fichierxml)

Retoursurlepackaging

• Ledescripteurdedéploiementsertàdéfinirlesparamètresdedéploiementd’uneapplication(ear)oud’unmodule

• Exemples:• application.xml:déclarerl’ensembledesmodulesintégrésdansunfichier(.ear)

• ejb-jar.xml:configurerlesEJBdansunmoduled’unfichier(.jar)• web.xml:configurerlesparamètresdumoduleweb(servlets,JSP,TagLib..)d’unfichier(.war)

Structured’unfichierEAR

Racine de l’application (.ear)

META-INF Module Web(.war)

Module EJB(.jar)

Module RessourceAdapter

(.rar)

Module applicationCliente(.jar)application.xml

sun-application.xmljboss-application.xml