Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilIlona Ševčíková
1
VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA Zbyněk Šlajchrt http://java.vse.cz/4it447/HomePage Část 10.
2
Odesílání a příjem zpráv 2
3
Synchronní komunikace Doposud jsme se zabývali převážně synchronní komunikací Klient zavolá business metodu a čeká na výsledek Příjemce musí být dostupný v okamžiku volání Klient se musí přizpůsobit charakteru příjemce Platforma Rozhraní Adresa + port Protokol komunikace Pevná vazba (tight coupling) Důsledky? 3
4
Asynchronní komunikace Při integraci různorodých aplikací často Není nutné čekat na výsledek Odesílatel a příjemce nemusí být současně dostupní Odesílatel "nezná" Platformu příjemce (integrované aplikace) Formu rozhraní na straně příjemce Fyzické umístění příjemce Specifický protokol vyžadovaný příjemcem Slabá vazba (loose coupling) Komunikaci zajišťuje "styčný důstojník" MOM Message-oriented middleware, Provider 4
5
MOM architektura Provider – zprostředkovává komunikaci Producer – odesílatel zprávy Consumer – příjemce (konzument) zprávy Destination – úložiště zprávy 5 Producer Consumer Destination Message Provider Msg sendsreceives
6
Java Message Service (JMS) Standardní API v Javě pro asynchronní komunikaci prostřednictvím zpráv (1998-2002, akt. verze 1.1) Analogie JDBC – abstrakce databází JMS – abstrakce MOM OpenMQ (referenční impl.), MQSeries, SonicMQ a další Součástí Java EE Poměrně nízko-úrovňové, avšak dobře fungující API 6
7
Message Driven Beans (MDB) Speciální EJB pro příjem zpráv (od EJB 2.0) Před EJB 3.1 často používané pro asynchronní volání Pozn.: Od verze EJB 3.1 lze používat asynchronní metody @Asynchronous MDB je obvykle napojeno na JMS destinaci fronta, topik lze teoreticky napojit na jiné protokoly – např. SMTP 7
8
Architektura JMS 8 Producer Consumer JMS Provide r JMS Provide r JNDI Directory lookup or injection produces a message consumes a message lookup or injection
9
Komponenty JMS Provider implementace JMS Klienti libovolná Java aplikace nebo komponenta využívající JSM k odesílání nebo přijímání zpráv producer, sender, publisher, consumer, receiver, subscriber Zprávy objekty které klienti posílají nebo přijímají Administrované objekty továrny připojení a destinace (fronty, topiky) umístěny v JNDI 9
10
Příklad: injektáž 10
11
Příklad: odeslání zprávy z EJB 11
12
Příklad příjmu zprávy v EJB 12
13
JMS destinace Point-to-point (P2P) model úložiště se nazývá fronta jeden klient odesílá zprávu druhý klient přijímá zprávu zpráva je po potvrzeném přijetí odstraněna Publish-subscribe (pub-sub) model úložiště se nazývá topik klient odesílá zprávu všichni klienti přihlášení k odebírání přijímají zprávu zpráva se odstraní po předání všem odběratelům 13
14
Point-to-point Určeno pro jednoho odesílatele a jednoho příjemce Odeslaná zpráva leží ve frontě dokud ji příjemce nevybere Odesílatel může odesílat zprávy, kdy se mu zachce Příjemce může odebírat zprávy, kdy se mu zachce přijímá i zprávy, které byly odeslány před jeho vytvořením 14 Producer Receiver Queue sends receives
15
Point-to-point: více příjemců Nelze se spoléhat na pořadí zpráv Ke frontě lze připojit více příjemců Zprávu vždy obdrží pouze jeden Pořadí předávání příjemcům je náhodné 15 Producer Receiver 1 Queue Receiver 2 M2 M1 M2
16
Publish-subscribe V pub-sub je zpráva odesílána jedním klientem Zpráva může být předána více klientům pouze těm, co jsou momentálně připojeni možno zaregistrovat tzv. trvalého příjemce Příjemce může zprávy přijímat asynchronně – přihlášení se k odběru, notifikace synchronně – čekání na zprávu voláním receive() 16 Publisher Subscribe r M M M M subscribes receives publishes topic
17
Publish-subscribe: více příjemců 17 Publisher Subscriber 1 M2 topic M1 Subscriber 2 M2 M1
18
Administrované objekty Objekty konfigurované administrátorsky, coby protiklad k objektům konfigurovaným programově JMS provider umožňuje jejich správu a zveřejnění v JNDI Továrny připojení Tyto objekty využívají klienti pro připojení k destinacím Destinace Zařízení sloužící k příjmu, dočasnému ukládání a distribuci zpráv. Destinace může být fronta (P2P) nebo topik (pub-sub) 18
19
JMS API 19
20
javax.jms.ConnectionFactory Továrny připojení jsou administrované objekty umožňující klientovi připojit se k JMS poskytovateli Typy továren připojení javax.jms.ConnectionFactory rozhraní pro vytváření spojení pro P2P i sub-pub komunikaci javax.jms.QueueConnectionFactory rozhraní pro vytváření spojení pro P2P komunikaci javax.jms.TopicConnectionFactory rozhraní pro vytváření spojení pro pub-sub komunikaci 20
21
Získání továrny připojení 21 Vyhledáním v JNDI: Injektáží:
22
Konfigurace v Glassfish v3 22
23
javax.jms.Destination Administrovaný objekt, který identifikuje JMS destinaci, tj. frontu nebo topik Různí provideři vyžadují různé konfigurace Programátorovi jsou tato specifika skryta Dvě rozhraní, která rozšiřují javax.jms.Destination javax.jms.Queue javax.jms.Topic 23
24
Získání destinací 24 Vyhledáním v JNDI: Injektáží:
25
Konfigurace v Glassfish v3 25
26
javax.jms.Connection Thread-safe spojení s destinacemi Lze jej sdílet mezi vlákny Důvod: otevření spojení se považuje za náročnou operaci Vlastní komunikace probíhá v rámci tzv. session Connection::createSession() Jedno-vláknový objekt Metody start(), stop() Spuštění a zastavení příjmu zpráv Metoda close() Uzavření spojení 26
27
Otevření spojení 27
28
javax.jms.Session Poskytuje kontext pro odesílání nebo přijímání zpráv v rámci jednoho vlákna Session může být transakční všechny zprávy jsou odeslány až při volání commit() Pozn.: v CMT se commit provádí automaticky nebo ne-transakční každá zprávy je odeslána okamžitě 28 příznak "transakčnosti" session potvrzovací mod
29
javax.jms.Session - potvrzování Potvrzovací mod (acknowledge mode) Specifikuje, jakým způsobem provider zjistí, že zpráva byla klientem zpracována AUTO_ACKNOWLEDGE předání zprávy klientovi se považuje za potvrzení přijetí CLIENT_ACKNOWLEDGE klient musí zavolat na zprávě acknowledge() DUPS_OK_ACKNOWLEDGE session posílá potvrzení v dávkách, nikoliv jednotlivě jako AUTO_ACKNOWLEDGE zlepšuje výkon může docházet k opakovanému přijetí stejné zprávy 29 http://www.novell.com/documentation/extend52/Docs/help/MP/jms/concepts/details.html
30
javax.jms.Session – jako továrna Továrna na Zprávy – createMessage() Odesílatele (Producers) – createProducer() Příjemce (Consumers) – createConsumer() Možno použít obecnou Session pro práci s oběma typy komunikace (P2P, pub-sub) Specializovaná rozhraní pro typ komunikace javax.jms.QueueSession javax.jms.TopicSession 30
31
Zprávy Struktura zprávy Hlavička Obsahuje metadata zprávy ve formě párů klíč-hodnota Klíče jsou standardizovány (viz tabulka na dalším snímku) Některé nastavuje provider, jiné aplikace Vlastnosti Aplikační metadata Lze na ně aplikovat tzv. selektory zpráv Tělo (nepovinné) Data přenášené zprávou StreamMessage, MapMessage, TextMessage, ObjectMessage, BytesMessage 31
32
Hlavičky zprávy JMSDestination Destinace, na kterou je zpráva odeslána (P) JMSMessageID Jednoznačný identifikátor zprávy (A) JMSExpiration Doba vypršení platnosti zprávy (A) JMSTimestamp Okamžik předání zprávy poskytovateli (P) JMSPriority Priorita zprávy (0-9) (A) 32 http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/jms/Message.html
33
javax.jms.MessageProducer Používá se k odesílání zpráv Vytváří jej Session::createProducer V P2P se mu přezdívá sender implementuje QueueSender V pub-sub se mu přezdívá publisher implementuje TopicPublisher Může specifikovat prioritu dobu platnosti mód doručení – PERSISTENT nebo NON_PERSISTENT 33
34
MessageProducer - příklad 34
35
javax.jms.MessageConsumer Používá se k přijímání zpráv Vytváří jej Session::createConsumer V P2P se mu přezdívá receiver Implementuje QueueReceiver V pub-sub se mu přezdívá subscriber Implementuje TopicSubscriber Zprávy lze přijímat dvěma způsoby synchronně asynchronně 35
36
Synchronní příjem zpráv V tomto případě příjemce zavolá na připojení metodu start() a čeká na zprávu voláním metody receive() na rozhraní MessageConsumer Více variant metody receive Message receive() blokuje vlákno dokud nedorazí zpráva Message receive(long timeout) blokuje vlákno dokud nedorazí zpráva nebo nevyprší časový limit (vrací null) Message receiveNoWait() neblokující metoda, vrací okamžitě zprávu nebo null 36
37
Synchronní příjem: příklad 37
38
Asynchronní příjem zpráv Klient zaregistruje posluchače prostřednictvím rozhraní MessageConsumer::setMessageListener() Až po registraci se zahájí příjem zpráv voláním Session::start() Při přijetí zprávy poskytovatel zavolá na posluchači metodu onMessage(Message message) Tato strategie je využívána v MDB 38
39
Asynchronní příjem: příklad 39
40
Selektory Někdy je zapotřebí filtrovat přijímané zprávy Důvod může být například snížení zatížení sítě Klient může při vytváření objektu MessageConsumer specifikovat kritéria pro přijímané zprávy Kritéria lze klást na Hlavičky (JMS... páry) Vlastnosti (aplikační údaje) Kritérium je vyjádřeno výrazem podmínky podmnožina syntaxe podmínky z SQL 92 40
41
Selektory: příklad 41 Příjemce: Odesílatel: Operátory Logické: NOT, AND, OR Porovnávací: =, >, >=, Aritmetické: +, -, *, / Výrazy [NOT] BETWEEN, [NOT] IN, [NOT] LIKE, IS [NOT] NULL
42
Durable Subscribers Nevýhoda pub-sub modelu je, že odběratel přijímá zprávy odeslané pouze v době, kdy je připojen JMS umožňuje vytvořit tzv. trvalý zápis (durable subscription) session.createDurableSubscriber(topic, "subscriberID") V tomto případě provider ukládá zprávy pro odběratele, pokud není zrovna on-line Nejvíce jeden posluchač může být on-line Zrušení trvalého zápisu session.unsubscribe("subscriberID") vypršení 42
43
Non-durable subscription 43 http://java.sun.com/products/jms/tutorial/1_3_1-fcs/doc/advanced.html#1024758
44
Durable subscription 44 http://java.sun.com/products/jms/tutorial/1_3_1-fcs/doc/advanced.html#1024758
45
Message Driven Beans (MDB) Další typ EJB Určen k asynchronnímu přijímání zpráv Není volán přímo jako ostatní EJB Funguje jako posluchač na vybrané JMS destinaci Blízký příbuzný bez-stavového EJB Zjednodušuje jinak poměrně složitý programovací model JMS 45
46
Podpora ze strany kontejneru Můžeme použít skoro všechny "vychytávky", které známe z ostatních EJB Injection CMT Vláknová bezpečnost - podobně jako u ostatních EJB Interceptory Callback metody životního cyklu @PostConstruct, @PreDestroy 46
47
Příklad jednoduchého MDB 47
48
Programovací model MDB neimplementuje ani lokální ani vzdálené rozhraní Implementuje javax.jms.MessageListener Třída MDB je anotovaná @javax.ejb.MessageDriven Musí mít public no-arg konstruktor Dodatečná konfigurace možná v ejb-jar.xml nebo pomocí anotací 48
49
@javax.ejb.MessageDriven Indikuje MDB Důležité atributy mappedName JNDI jméno destinace konfigurované na serveru jednoduché, avšak není přenositelné, jelikož jméno je poplatné konkrétnímu serveru přenositelný odkaz pomocí konfigurace v ejb-jar.xml activationConfig Dodatečná konfigurace 0 nebo více vlastností - @ActivationConfigProperty 49
50
Dodatečná konfigurace 50
51
Konfigurační položky pro OpenMQ destinationType TOPIC nebo QUEUE destination název destinace messageSelector JMS selektor acknowledgeMode mod doručení subscriptionDurability NON_DURABLE (default), DURABLE subscriptionName identifikáto trvalého přihlášení k odběru 51
52
Životní cyklus MDB 52 Does Not Exist Method-Ready Pool @PreDestroy Class.newInstance() injections @PostConstruct onMessage
53
Transakce v MDB Jednodušší situace v případě transakcí řízených kontejnerem (CMT) Pouze dva transakční atributy mají smysl REQUIRED – onMessage() bude běžet v transakci NOT_SUPPORTED – onMessage() nebude běžet v transakci 53
54
Zdroje Burke, Bill – Monson-Haefel, Richard; Enterprise Java Beans 3.0; O'Reilly Goncalves, Antonio; Beginning Java EE 6 Platform With GlassFish 3; APRESS 54
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.