Message Driven Bean - BENELALLAM

31
Message Driven Bean

Transcript of Message Driven Bean - BENELALLAM

Page 1: Message Driven Bean - BENELALLAM

Message Driven Bean

Page 2: Message Driven Bean - BENELALLAM

MessageDriven Bean:Définition

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

Page 3: Message Driven Bean - BENELALLAM

MessageDriven Bean:Casd’utilisation

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

• Lemessagedoitêtretraitéd’unemanièreasynchrone.

Page 4: Message Driven Bean - BENELALLAM

MessageDriven Bean:Motivation

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

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

• Pasdebroadcasting !• RMI-IIOPlimitelesliaisons1clientvers1serveur

Page 5: Message Driven Bean - BENELALLAM

Messaging

• C'estcommelemail!Oucommesionavaitunetroisièmeentitéentreleclientetleserveur!

Page 6: Message Driven Bean - BENELALLAM

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…

Page 7: Message Driven Bean - BENELALLAM

TheJavaMessageService(JMS)

• LesserveursMOMsontpourlaplupartpropriétaires:pasdeportabilitédesapplications!

• JMS=unstandardpournormaliserleséchangesentrecomposantetserveurMOM,

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

Page 8: Message Driven Bean - BENELALLAM

JMS:MessagingDomains• Avantdefairedumesaging,ilfautchoisirundomaine

• Domaine=typedemessaging

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

• PointToPoint(PTP):nproducteurs,1consommateur

Page 9: Message Driven Bean - BENELALLAM

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

Page 10: Message Driven Bean - BENELALLAM

JMS:lesinterfaces

Page 11: Message Driven Bean - BENELALLAM

JMS:exempledecode(1)

Page 12: Message Driven Bean - BENELALLAM

JMS:exempledecode(2)

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

Page 13: Message Driven Bean - BENELALLAM

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…

Page 14: Message Driven Bean - BENELALLAM

Qu'est-cequ'unMessage-DrivenBean?

• UnEJBquipeutrecevoirdesmessages• Ilconsommedesmessagesdepuislesqueuesoutopics,envoyésparlesclientsJMS

Page 15: Message Driven Bean - BENELALLAM

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…

Page 16: Message Driven Bean - BENELALLAM

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.

Page 17: Message Driven Bean - BENELALLAM

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…

Page 18: Message Driven Bean - BENELALLAM

DévelopperunMessage-Driven Bean

Page 19: Message Driven Bean - BENELALLAM

Unexemplesimple

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

• Utilepourdébugger….

• Rappel:pasd'interfaces!

Page 20: Message Driven Bean - BENELALLAM

Laclassedubean

Page 21: Message Driven Bean - BENELALLAM

Laclassedubean(suite)

Page 22: Message Driven Bean - BENELALLAM

Question?

• Commentsait-onquellequeueouqueltopicdemessageslebeanconsomme?

• Celan'apparaîtpasdansledescripteur!

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

Page 23: Message Driven Bean - BENELALLAM

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();

Page 24: Message Driven Bean - BENELALLAM

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);

}

}

Page 25: Message Driven Bean - BENELALLAM

MessageDriven Bean:Implémentation

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

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

Page 26: Message Driven Bean - BENELALLAM

MessageDriven Bean:Implémentation

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

Page 27: Message Driven Bean - BENELALLAM

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.

Page 28: Message Driven Bean - BENELALLAM

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.

Page 29: Message Driven Bean - BENELALLAM

Retoursurlepackaging

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

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

Page 30: Message Driven Bean - BENELALLAM

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)

Page 31: Message Driven Bean - BENELALLAM

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