Vývoj PODNIKOVých aplikací na platformě JAVA

Download Report

Transcript Vývoj PODNIKOVých aplikací na platformě JAVA

VÝVOJ PODNIKOVÝCH
APLIKACÍ NA PLATFORMĚ
JAVA - PŘEDNÁŠKA
Část 4.
Zbyněk Šlajchrt
http://java.vse.cz/4it447/HomePage
Vrstvy aplikace a jejich vymezení
Prezentační vrstva
"Jak aplikace vypadá"
Servlety
JSP
Filtry
Business vrstva
"Co aplikace dělá"
Bezstavové EJB Beans
Stavové EJB Beany
Message Driven Beany
Perzistentní vrstva
"Co aplikace je"
JPA Entity
JMS Fronty
JMS Topiky
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
Typy EJB

Bezstavové (stateless session beans)
 mezi

voláními neuchovávají stav pro klienta
Stavové (stateful session beans)
 uchovávají

Jedináček (singleton) – od verze Java EE 6
 slouží

stav konverzace mezi aplikací a klientem
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
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
 Dependency
 JMS
 State
komunikaci mezi klientem a aplikací
injection
destinace, datové zdroje, EJB, proměnné prostředí ad.
management
 Stavové
beany udržují vzdálený stav klienta
 Klientovi se to jeví, jakoby byl stav uložen lokálně transparentnost
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í
 Stará
cyklus komponent
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
EJB kontejner

Další úkoly
 Management
transakcí
 Beany
deklarují transakční vlastnosti metod
 Kontejner řeší commit a rollback
 Bezpečnost
 Deklarace
 Podpora
 Vývojář
přístupů na úrovní tříd a metod
souběžného zpracování požadavků
se nemusí starat o problémy se souběžností
 Výjimkou singleton, kde je zapotřebí jistá deklarace
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í
 Od
volání metod
EJB 3.1 je možné volat metody asynchronně
 Lze se tak vyhnout použití JMS
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í
Embedded Container - ukázka
Pro Glassfish v3 viz:
http://ctpjava.blogspot.com/2009/10/unit-testing-ejbs-and-jpa-with.html
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
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
Rozhraní beanu - příklad
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
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)
Bezstavový bean - příklad
Volání beanu z klientské aplikace
Syntaxe globálního jména:
java:global/<app-name>/<module-name>/<bean-name>!<fully-qualified-interface-name>
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
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
z
ENC vznikne položka odkazující na externí prostředek
EJB XML
 META-INF/ejb-jar.xml
 deployment
deskriptor EJB modulu
Příklad: Konfigurační parametr
Příklad – Konfigurace v ejb-jar.xml
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

getCallerPrincipal()
 vrací

aktuálního uživatele
getBusinessObject(Class rozhraní)
 vrací

SessionContext ctx;
reference na aktuální EJB, kterou lze předávat
lookup(String name)
 slouží
k vyhledávání objektů v ENC (JNDI)
Životní cyklus bezstavového beanu
systémová výjimka
Does Not Exist
Class.newInstance()
injections
@PostConstruct
@PreDestroy
Method-Ready
Pool
business
method
Ž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ů
Ž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
 po

údaje o klientovi a o probíhající transakci
skončení volání putuje zpět do poolu
Smrt
 pokud
je kontejner již nepotřebuje
 redukce
 volá
paměti zabírané poolem
se metoda označená @PreDestroy
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
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
Stavový bean - příklad
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)
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 ve WEB-INF/web.xml – lokální rozhraní
Volání stavového beanu ze servletu
Uzavírací metoda - @Remove

Voláním metody označené @Remove se ukončí život
stavového session beanu
Životní cyklus stavového beanu
systémová výjimka
Does Not Exist
@PreDestroy
Class.newInstance
Injections
@PostConstruct
Method-Ready
timeout
@PrePasivate
@PostActivate
business
method
timeout
Passivated
Ž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ů
Ž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í
 Relace
časového limitu – timeout
stavového beanu může být časově omezena
 Udává anotace @StatefulTimeout nebo prvek
<stateful-timeout> v ejb-jar.xml
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
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)
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
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
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
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
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
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
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
 bean
řízená beanem (BMC)
si řídí souběžnost sám
 používá prostředky Javy, případne java.util.concurrent.*
Životní cyklus singletonu
systémová výjimka
Does Not Exist
(vytváření závislostních singletonů)
Class.newInstance
Injections
@PostConstruct
Method-Ready
business method
@PreDestroy
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
Asynchronní volání - příklad
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)
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