VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Post on 19-Feb-2016

53 views 0 download

description

VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA. Zbyněk Šlajchrt http://java.vse.cz/4it447/HomePage. Část 4. Vrstvy aplikace a jejich vymezení. Prezentační vrstva "Jak aplikace vypadá". Servlety JSP Filtry. Business vrstva "Co aplikace dělá". Bezstavové EJB Beans - PowerPoint PPT Presentation

transcript

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