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