VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKAZbyněk Šlajchrt http://java.vse.cz/4it447/HomePageČást 4.
Vrstvy aplikace a jejich vymezení
Prezentační vrstva"Jak aplikace vypadá"
Business vrstva"Co aplikace dělá"
Perzistentní vrstva"Co aplikace je"
ServletyJSPFiltry
Bezstavové EJB BeansStavové EJB BeanyMessage Driven Beany
JPA EntityJMS FrontyJMS Topiky
2
Enterprise Java Beans Modelují aplikační logiku
operace nad entitami z perzistentní vrstvy interakce s webovými službami odesílání asynchronních zpráv jiným systémům generování výstupních sestav
Transakční zpracování demarkace začátku a konce transakce důvod: zajištění konzistence dat
Bezpečnost k operacím lze přiřadit role
3
Typy EJB Bezstavové (stateless session beans)
mezi voláními neuchovávají stav pro klienta Stavové (stateful session beans)
uchovávají stav konverzace mezi aplikací a klientem
Jedináček (singleton) – od verze Java EE 6 slouží ke sdílení dat mezi klienty a komponentami
Řízené zprávami (message-driven, MDB) nevolají se přímo jsou vyvolány kontejnerem při příchodu zprávy
4
EJB kontejner Prostředí, do kterého se nasazují EJB
komponenty Má na starosti především tyto úkoly
Komunikace se vzdáleným klientem Zjednodušuje komunikaci mezi klientem a aplikací
Dependency injection JMS destinace, datové zdroje, EJB, proměnné prostředí
ad. State management
Stavové beany udržují vzdálený stav klienta Klientovi se to jeví, jakoby byl stav uložen lokálně -
transparentnost
5
EJB kontejner Další úkoly
Pooling Pro bezstavové a MDB beany vytváří pool instancí -
sdílení Každá instance řeší právě jeden požadavek
Životní cyklus komponent Stará se o vytváření, inicializaci, destrukci a další
události Messaging
Umožňuje MDB poslouchat na JMS destinacích a konzumovat zprávy
Odstiňuje programátora od komplikovaného JMS
6
EJB kontejner Další úkoly
Management transakcí Beany deklarují transakční vlastnosti metod Kontejner řeší commit a rollback
Bezpečnost Deklarace přístupů na úrovní tříd a metod
Podpora souběžného zpracování požadavků Vývojář se nemusí starat o problémy se
souběžností Výjimkou singleton, kde je zapotřebí jistá
deklarace
7
EJB kontejner Další úkoly
Správa interceptorů Komponenty, které mohou odchytávat okamžik
před a po volání metody. Lze je definovat napříč aplikací
Asynchronní volání metod Od EJB 3.1 je možné volat metody asynchronně Lze se tak vyhnout použití JMS
8
Embedded container Možnost spouštět EJB aplikace v
prostředí Java SE Usnadňuje testování a ladění aplikací Podporuje pouze podmnožinu EJB Lite
Bez MDB, vzdálených rozhraní, WS, Timer ...
může být omezující
9
Embedded Container - ukázka
Pro Glassfish v3 viz:http://ctpjava.blogspot.com/2009/10/unit-testing-ejbs-and-jpa-with.html
10
Rozhraní Lokální rozhraní
Definuje metody, které mohou volat jiné beany ve stejném kontejneru (tj. JVM)
Beany mohou komunikovat přímo, nikoliv přes distribuovaný objektový protokol (např. IIOP)
Je anotováno @javax.ejb.Local Vzdálené rozhraní
Definuje metody, které mohou být volány z okolí kontejneru
Komunikace probíhá v distr. objektovém protokolu Je anotováno @javax.ejb.Remote
11
Rozhraní Endpoint rozhraní
Definuje metody, které mohou být volány pomocí SOAP protokolu
Je anotováno @javax.jws.WebService Message rozhraní
Implementováno Message-driven beany Voláno JMS nebo jiným MOM Typ rozhraní závisí na MOM Pro JMS je to javax.jms.MessageListener
12
Rozhraní beanu - příklad13
Třída session beanu Podle typu musí být anotována
@Stateless @Stateful
Musí mít aspoň jedno rozhraní: lokální, vzdálené nebo endpoint.
'Mít' znamená klasickou implementaci v Javě (implements) pomocí anotací na třídě (@Local, @Remote)
Je možné mít více rozhraní stejného typu
14
Bezstavové session beany Provádějí jednorázové operace
často zapouzdřují nějakou proceduru ta musí obvykle proběhnout atomicky
provede se celá – změny se projeví v datech zhavaruje – jakoby se nikdy neprováděla
Jedna instance může obsluhovat více klientů je k dispozici všem klientům obvykle existuje více instancí, které jsou uloženy
v tzv. poolu analogie s poolem vláken (thread pool)
15
Bezstavový bean - příklad16
Volání beanu z klientské aplikace
Syntaxe globálního jména:java:global/<app-name>/<module-name>/<bean-name>!<fully-qualified-interface-name>
17
Volání beanu z jiných komponent
• Dependency injection nabízí velmi pohodlné získání reference
• Lze ale použít i vyhledání v JNDI pomocí lookup
18
Přístup k proměnným prostředí EJB kontejner vlastní registr konfiguračních
parametrů a odkazů na externí služby Enterprise Naming Context (ENC) Inicializuje se
z anotací @Resource(mappedName="someDataSource") v ENC vznikne položka odkazující na externí
prostředek z EJB XML
META-INF/ejb-jar.xml deployment deskriptor EJB modulu
19
Příklad: Konfigurační parametr
20
Příklad – Konfigurace v ejb-jar.xml
21
SessionContext Poskytuje pohled do EJB kontejneru Beany pomocí něj volají různé služby kontejneru Reference se získává injektáží do atributu beanu
@Resource SessionContext ctx; getCallerPrincipal()
vrací aktuálního uživatele getBusinessObject(Class rozhraní)
vrací reference na aktuální EJB, kterou lze předávat lookup(String name)
slouží k vyhledávání objektů v ENC (JNDI)
22
Životní cyklus bezstavového beanu
Does Not Exist
Method-Ready Pool
@PreDestroyClass.newInstance()injections@PostConstruct
businessmethod
systémová výjimka23
Životní cyklus bezstavového beanu Stav Does Not Exist
stav-nestav, instance ještě neexistuje Stav Method-Ready Pool
instance se nachází v poolu čeká na vyzvednutí kontejnerem a obsloužení klienta
Přechod z Does Not Exists -> Method-Ready Pool vytvoření nové instance Class.newInstance() injektáž potřebných prostředků (anotace + XML) volání metody označené anotací @PostConstruct
musí mít návratový typ void a být bez parametrů
24
Životní cyklus bezstavového beanu Vyzvednutí z poolu
bean 'neví', kterého klienta bude obsluhovat kontejner před voláním nastaví odpovídající
SessionContext obsahuje údaje o klientovi a o probíhající transakci
po skončení volání putuje zpět do poolu Smrt
pokud je kontejner již nepotřebuje redukce paměti zabírané poolem
volá se metoda označená @PreDestroy
25
Stavové session beany Udržují stav konverzace
udržování klientských dat mezi voláními Každé volání jednoho klienta obsluhuje stejný
objekt Celý život beanu je věnován jedinému klientovi Lze je nahlížet jako "prodlouženou ruku" klienta
klient si odkládá část své logiky a stavu na server
26
Rozhraní stavového beanu - příklad• Podobně jako v případě bezstavového beanu, také pro stavový bean lze deklarovat lokální a vzdálené rozhraní• V tomto případě mají obě rozhraní společného předka
27
Stavový bean - příklad28
Stavový bean - implementace Třída stavového beanu se anotuje @Stateful Implementuje lokální a/nebo vzdálené
rozhraní Stav v atributech beanu se uchovává mezi
voláními cart, client
Lze injektovat jiné beany nebo prostředky orderService – odkaz na bezstavový bean em – JPA manažer entit (perzistence)
29
Použití stavového beanu v servletu Nemůžeme použít dependency injection
Servlet je jedináček => je sdílený mezi klienty Injektovaná instance stavového beanu by
nepatřila právě jednomu klientovi! Musíme použít JNDI lookup vyhledat si
bean sami Lze zařídit, aby odkaz na bean byl v kontextu
webové aplikace. Konfigurace anotacemi nebo ve
WEB-INF/web.xml – lokální rozhraní
30
Definice EJB v enterprise kontextu
31
Pomocí anotací:
Ve web.xml, případně ejb-ja.xml:
Volání stavového beanu ze servletu
32
Uzavírací metoda - @Remove Voláním metody označené @Remove se
ukončí život stavového session beanu
33
Životní cyklus stavového beanu
Does Not Exist
Method-Ready Passivated
Class.newInstanceInjections@PostConstruct
timeout@PreDestroy timeout
@PrePasivate
@PostActivate
businessmethod
systémová výjimka
34
Životní cyklus stavového beanu Stav Does Not Exist
stav-nestav, instance ještě neexistuje Stav Method-Ready Pool
Instance je v paměti a může obsluhovat svého klienta
Udržuje klientův vzdálený stav Přechod z Does Not Exists -> Method-Ready
vytvoření nové instance Class.newInstance() injektáž potřebných prostředků (anotace + XML) volání metody označené anotací @PostConstruct
musí mít návratový typ void a být bez parametrů
35
Životní cyklus stavového beanu Opuštění stavu Method-Ready
Zavolání metody anotované @Remove přechází bean do stavu Does Not Exist
Kontejner se může kdykoliv rozhodnout pro tzv. pasivaci Většinou při zatížení serveru, čištění paměti Algoritmus pasivace/aktivace není specifikován
(srovnej s migracemi HTTP session) Vypršení časového limitu – timeout
Relace stavového beanu může být časově omezena
Udává anotace @StatefulTimeout nebo prvek <stateful-timeout> v ejb-jar.xml
36
Poznámka k transientním atributům Serializace v Javě nastavuje transientní
atributy na jejich defaultní hodnoty primitivní čísla na 0 boolean na false reference na null
V EJB tomu tak není a transientní atribut může po aktivaci nabývat libovolné hodnoty jejich hodnota by měla být nastavana v
@PostActivate
37
Pasivace stavového beanu Pravidla pro hodnoty atributů stavového
beanu (stav konverzace s klientem) Primitivní typy nebo serializovatelné objeky javax.ejb.SessionContext javax.jta.UserTransaction (transakce řízené
mimo kontejner) javax.naming.Context (pouze pokud odkazuje
na JNDI ENC) javax.persistence.EntityManager javax.persistence.EntitiyManagerFactory reference na jiné EJB reference na tovární třídy prostředků řízené
kontejnerem (např. javax.sql.DataSource)
38
Pasivace stavového beanu V okamžiku, kdy se kontejner chystá pasivovat
bean, volá se metoda označená @PrePasivate uzavírají se v ní otevřená připojení všechny neserializovatelné atributy, které nejsou
transientní, se nastavují na null transientní atributy se ignorují
Způsob uložení stavu závisí na implementaci serveru obvykle se využívá standardní serializace v Javě
Kontejner hlídá timeout i ve stavu pasivace
39
Aktivace stavového beanu Jakmile klient zavolá metodu na pasivovaném
beany, kontejner provádí jeho aktivaci Kontejner provádí tyto úkony:
deserializace pasivovaného objektu rekonstrukce odkazu na SessionContext rekonstrukce odkazů na EJB a továrny prostředků
Po těchto úkonech se volá metoda označená @PostActivate otevírají se v ní připojení uzavřená před pasivací nastavují se hodnoty do atributů, které se nulovaly
40
Systémové výjimky Kdykoliv je vyhozena systémová výjimka, kontejner
zruší bean -> přechod do stavu Does Not Exist Reprezentují interní chyby Systémová výjimka je libovolná nekontrolovaná
výjimka (RuntimeException), která není anotovaná @ApplicationException také kontrolovaná výjimka java.rmi.RemoteException
Důsledky rollback transakce, logovací hláška, zrušení instance při pokusu klienta volat zrušený stavový bean se
vyhazuje NoSuchEJBException
41
No-interface View Novinka v EJB 3.1 (Java EE 6) Vývojáři chtěli navrhovat session bean
bez nutnosti psát rozhraní V EJB 3.1 se nemusí psát lokální rozhraní
lokální rozhraní je tvořeno veřejnými metodami beanu
třída beanu je označená @LocalBean
42
Singleton EJB (od verze EJB 3.1) Session bean, který má v aplikaci
jedinou instanci Vhodné pro sdílení dat napříč aplikací
srovnej s aplikačním kontextem ServletContext
Uchovává stav mezi voláními Třída singletonu je označena @Singleton Může být vytvořen při startu aplikace
Třída singletonu se označí @Startup
43
Singleton EJB Možnost řetězení v případě, že je
důležité pořadí vytváření více singletonů @DependsOn(“SomeSingleton1”,
“SomeSingleton2”) kontejner zajistí jejich vytvoření před
vytvořením singletonu, který na nich závisí Poznámka: V clusterech má každý uzel
vlastní singleton
44
Singleton - souběžnost Souběžný přístup k singletonu je možný a je
řízen anotací @ConcurrencyManagement Souběžnost řízená kontejnerem (CMC) - default
kontejner řídí souběžnost podle anotací na beanu @Lock(LockType.WRITE) – exkluzivní přístup k metodám @Lock(LockType.READ) – sdílený přístup k metodám možnost umístit na jednotlivé metody i třídu @AccessTimeout(timeout) – max. doba čekání na
uvolnění Souběžnost řízená beanem (BMC)
bean si řídí souběžnost sám používá prostředky Javy, případně java.util.concurrent.*
45
Životní cyklus singletonu
Does Not Exist
Method-Ready
business method
systémová výjimka
(vytváření závislostních singletonů)Class.newInstanceInjections@PostConstruct
@PreDestroy
46
Asynchronní volání (od EJB 3.1) Volání metod na lokálním i vzdáleném rozhraní
session beanu jsou obvykle synchronní (blokovaná) Často je zapotřebí asynchronní (neblokované) volání
nečeká se na výsledek, např. tisk Dříve řešeno pomocí Message Driven Beans a JMS V EJB 3.1 lze metodu nebo třídu označit anotací
@Asynchronous návratový typ asynchronní metody
void java.util.concurrent.Future – možnost vyzvednout si
výsledek později
47
Asynchronní volání - příklad48
Analogie k session beanům Bezstavový bean
prostitutka – čeká v poolu (veřejný dům) na instrukci mamá, aby obsloužila klienta
klient si při opakovaných návštěvách nemůže být obvykle jist, zda bude obsloužen stejnou slečnou
Stavový bean věrná manželka po svatbě (vytvoření session) se v ideálním případě
až do své smrti (volání metody @Remove) věnuje pouze svému maželovi (klientovi)
sdílení majetku a rozhodování (odkládání stavu a logiky klienta na server)
49
XML Deployment Descriptor Veškeré deklarace anotacemi tříd,
rozhraní a metod lze analogicky provádět v tzv. XML deskriptoru
Deskriptor je uložen v META-INF/ejb-jar.xml EJB modulu
50