Sapientia - EMTE 2008
Az előadás célja Üzenetkommunikációs architektúrák JMS Példák Üzenet gyártó Szinkron üzenetfogyasztó Aszinkron üzenetfogyasztó Üzenetbab (message-driven bean)
point-to-point modell: az üzenetet egyetlen cálalkalmazáshoz kell eljuttatni Üzenetek tárolása: memória perzisztens tároló publish-subscribe modell: az üzenetet több komponensnek, illetve több alkalmazásnak kell továbbítani broadcast (üzenetszórás) jellegű közzététel publisher: az üzenet készítője topic: téma kör subscriber: előfizetők
Point-point architektúra
Publish-subscribe architektúra
Üzenetrendszer résztvevők
Üzenetrendszer : olyan interfészek és osztályok halmaza, mely az üzenetkezelő szolgáltatások gyártófüggetlen elérését lehetővé teszik - (javax.jms csomag) implementáció: konkrét üzenetkezelő rendszer. Nem szükségszerű, hogy ban legyen implementálva. Alkalmazásszerver JMS támogatással: névszolgáltatást biztosít. Regisztrálni kell a kapcsolat gyártókat, üzenetküldési/-fogadási végpontokat (queue, topic) Ügyfél: amely a névszolgáltatás segítségével igénybe veszi a szolgáltatást
Adminisztrált objektumok Ezeket alkalmazásszerverben kell létrehozni (pl. GlassFish): Connection Factories szerepe kódból kapcsolatot létesíthetünk üzenetkezelő rendszerrel. Destination Resources típusok: Topic Destination: publish-subscribe architektúrához Queue Destination: point-to-point architektúrához
Üzenetrendszer ügyfelek Feladatuk: üzenet gyártása vagy fogyasztása gyártó fogyasztó szinkron : várakozik amíg üzenet érkezik aszinkron: azügyfél regisztrál az üzenetsornál, amely üzenet érkezésekor értesíti az összes regisztrált ügyfelet
Üzenetek Részei: fejléc: az üzenet továbbítására vonatkozó információk tulajdonságok: (név-érték) párok törzs: az üzenet tartalma üzenet típusok: TextMessage : karakterlánc MapMessage : asszociatív tömb BytesMessage : bájtsorozat StreamMessage: primitív típusú adatokat tartalmazó adatfolyam ObjectMessage: szerializálható objektum
JMS használat tipikus lépései 1. JNDI segítségével lekérjük a ConnectionFactory-t. Ez tartalmazza a kapcsolódáshoz szükséges paramétereket. Ennek segítségével kapcsplatot nyitunk az üzenetrendszerrel (Connection). 2. A Connection segítségével létrehozunk egy Session objektumot. Ez testesíti meg az üzenetküldés és fogadás munkamenetét. 3. Végponttól és architektúrától függően létrehozzuk az üzenetküldő, illetve fogadó objektumokat. küldő: QueueSender, TopicPublisher fogadó: QueueReceiver, TopicSubscriber
Példák Mindhárom projekt Netbeansben készült, típusa: Enterprise Application Client QSender SyncQReceiver AsyncQReceiver http://www.ms.sapientia.ro/ manyi/qsender.txt http://www.ms.sapientia.ro/ manyi/syncqreceiver.txt http://www.ms.sapientia.ro/ manyi/asyncqreceiver.txt
Üzenetbabok készítése aszinkron üzenetfogyasztó ügyfelek implementálják a MessageListener interfészt nincs közvetlen interfészük, sem lokális, sem pedig távoli eléréshez ezzel a komponenssel indirekt módon, az üzenetsoron keresztül, lehet kommunikálni rejtőzködő komponensek
MessageListener interfész import javax.jms.*; public interface MessageListener{ public void onmessage( Message message); }
Üzenetbab I package jms; import javax.ejb.activationconfigproperty; import javax.ejb.messagedriven; import javax.jms.*; @MessageDriven( mappedname = "jms/myqueue", activationconfig = { @ActivationConfigProperty (propertyname = "acknowledgemode", propertyvalue = "Auto-acknowledge"), @ActivationConfigProperty (propertyname = "destinationtype", propertyvalue = "javax.jms.queue") }
Üzenetbab II ) public class MessageListenerBeanBean implements MessageListener { public void onmessage( Message message ){ TextMessage msg = null; try{ if( message instanceof TextMessage){ msg = (TextMessage) message; System.out.println( "Received message: "+msg.gettext()); } else{ System.out.println( "Message of wrong type "); }
Üzenetbab III } } } catch( Exception e ){ System.out.println( "Exception: "+ e.getmessage()); }