Stanowe komponenty sesyjne

Podobne dokumenty
Komponenty sterowane komunikatami

Enterprise JavaBeans

1. Model ACID. 2. Deklaratywne zarządzanie transakcjami, atrybuty transakcji. 3. Propagacja transakcji. transakcje rozproszone, propagacja kontekstu

Usługa TimerService

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Programowanie komponentowe 5

public interface TravelAgent { public void makereservation(int cruiseid, int cabinid, int customerid, double price); }

Aplikacje internetowe i rozproszone - laboratorium

1. Podstawowe usługi bezpieczeństwa. 2. Użytkownicy i role. przydzielanie uprawnie ń metodom, role komponentów, korzystanie i konfiguracja

Aplikacje RMI Lab4

Aplikacja wielowątkowa prosty komunikator

Wzorce logiki dziedziny

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Komponent encyjny: Cabin

1 Atrybuty i metody klasowe

Rola EJB na platformie Java EE. Enterprise JavaBeans (EJB)

Aplikacja wielow tkowa prosty komunikator

Programowanie obiektowe

Programowanie i projektowanie obiektowe

Podejście obiektowe do budowy systemów rozproszonych

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Enterprise JavaBeans (EJB)

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Wprowadzenie do Enterprise JavaBeans 2.0

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Systemy Rozproszone - Ćwiczenie 6

Java. Programowanie Obiektowe Mateusz Cicheński

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Aplikacje RMI

Remote Method Invocation 17 listopada 2010

Wywoływanie metod zdalnych

Projektowanie Aplikacji Internetowych. Wzorce projektowe warstwy usług

Zaawansowane aplikacje internetowe

Wykład 7: Pakiety i Interfejsy

Programowanie obiektowe

Zaawansowane aplikacje WWW - laboratorium

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Zastosowanie komponentów EJB typu Session

Wzorce dystrybucji i wspólbieżności autonomicznej

Tworzenie i wykorzystanie usług

Podstawowe informacje o technologii Java EE 7

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Wywoływanie metod zdalnych

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Dokumentacja do API Javy.

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Enterprise Java Beans Narzędzia i Aplikacje Java EE

Contexts and Dependency Injection (CDI) Autor wykładu: Marek Wojciechowski

"Biznesowe" wzorce projektowe

Wykład 12. Programowanie serwera MS SQL 2005 w C#

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

Współbieżność w środowisku Java

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Aplikacje w Javie- wykład 11 Wątki-podstawy

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Laboratorium 8 Diagramy aktywności

Programowanie komponentowe

1. Co można powiedzieć o poniższym kodzie (zakładając, że znajduje się on w jednym pliku A.java)?

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Języki i metody programowania Java. Wykład 2 (część 2)

Aplikacje w środowisku Java

Programowanie współbieżne Laboratorium nr 11

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

JAVA I SIECI. MATERIAŁY:

Aplikacje w środowisku Java

Plan prezentacji. Budowa aplikacji w technologii Enterprise JavaBeans. Przegląd architektur: CORBA. Cele budowy aplikacji rozproszonych

Dawid Gierszewski Adam Hanasko

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Java: interfejsy i klasy wewnętrzne

KLASY, INTERFEJSY, ITP

Budowa aplikacji wielowarstwowych. Obsługa zdarzeń

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Zastosowanie słuchaczy zdarzeń wg

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Programowanie obiektowe

Aplikacje biznesowe Wykład dla studentów Informatyki Stosowanej

JAVA I BAZY DANYCH. MATERIAŁY:

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

EJB 3.0 & JBoss Seam. 25 kwietnia 2007 Jacek Gerbszt 1

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie rozproszone w języku Java

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Relacje. 1. Modelowanie relacji. - siedem rodzajów relacji J2EE. - relacje jedno i wielokierunkowe, - relacje reprezentowane przez kolekcje.

Projektowanie Aplikacji Internetowych Jarosław Kuchta. Wzorce projektowe warstwy biznesowej

Kontenery i komponenty graficzne

Transkrypt:

Stanowe komponenty sesyjne 1. Porównanie komponentów stanowych i bezstanowych. 2. Cykl życia stanowego komponentu sesyjnego, 3. Komponenty sesyjne a kontekst utrwalania, 4. Zagnieżdżanie komponentów sesyjnych, 5. Przykład: TravelEntityBean. 1

Stanowe komponenty sesyjne Egzemplarz stanowego komponentu sesyjnego jest związany z pojedynczym klientem. Atrybuty komponentu - jego stan - są przechowywane pomiędzy kolejnymi wywołaniami metod. Pomimo tego stanowe komponenty te nie podlegają utrwalaniu. Stanowe komponenty sesyjne pozwalają na przeniesienie części logiki biznesowej wraz ze stanem konwersacji z aplikacji klienckiej na serwer. Komponenty te działają często jako agenci, poprzez których aplikacje klienckie otrzymują dostęp do zasobów i funkcji realizowanych przez kontener EJB. 2

Porównanie komponentów bezstanowych i stanowych package pl.edu.uj.fais.wzorce_07.beans; import javax.ejb.remote; @Remote public interface ExampleRemote { public String getresponse(); 3

Komponent bezstanowy package pl.edu.uj.fais.wzorce_07.beans; import javax.ejb.stateless; @Stateless public class ExampleStateless implements ExampleRemote{ private static int count = 0; private String name; private int number = 0; public ExampleStateless(){ this.name = "Stateless_" + String.valueOf(++count); public String getresponse() { return this.name + ": " + String.valueOf(++this.number); 4

Komponent stanowy package pl.edu.uj.fais.wzorce_07.beans; import javax.ejb.stateful; @Stateful public class ExampleStateful implements ExampleRemote{ private static int count = 0; private String name; private int number = 0; public ExampleStateful(){ this.name = "Stateful_" + String.valueOf(++count); public String getresponse() { return this.name + ": " + String.valueOf(++this.number); 5

Klient package pl.edu.uj.fais.wzorce_07.clients; import java.util.properties; import javax.naming.context; import javax.naming.initialcontext; import javax.naming.namingexception; import pl.edu.uj.fais.wzorce_07.beans.exampleremote; public class ExampleClient implements Runnable { public static void main(string[] args) throws Exception { Properties p = new Properties(); p.load(exampleclient.class.getresourceasstream( "jndi.properties")); System.getProperties().putAll(p); ExampleClient cl; Thread t; for (int i = 0; i < args.length; i++) { t = new Thread(new ExampleClient(args[i])); t.start(); 6

Klient private String sname; public ExampleClient(String s) { this.sname = s; public void run() { ExampleRemote statefulbean, statelessbean; try { Context cx = new InitialContext(); statelessbean = (ExampleRemote) cx.lookup("examplestateless/remote"); statefulbean = (ExampleRemote) cx.lookup("examplestateful/remote"); catch (NamingException ex) { ex.printstacktrace(); return; 7

Klient for (int i = 0; i < 3; i++) { System.out.println(this.sName + ": " + statelessbean.getresponse()); for (int i = 0; i < 3; i++) { System.out.println(this.sName + ": " + statefulbean.getresponse()); 8

Wynik działania czwarty: Stateles_1: 1 czwarty: Stateles_1: 2 czwarty: Stateles_1: 3 czwarty: Stateful_1: 1 czwarty: Stateful_1: 2 czwarty: Stateful_1: 3 trzeci: Stateles_1: 4 trzeci: Stateles_2: 1 trzeci: Stateles_1: 5 trzeci: Stateful_2: 1 trzeci: Stateful_2: 2 trzeci: Stateful_2: 3 drugi: Stateles_1: 6 pierwszy: Stateles_3: 1 drugi: Stateles_2: 2 piaty: Stateles_1: 7 piaty: Stateles_3: 2 pierwszy: Stateles_5: 1 drugi: Stateles_4: 1 drugi: Stateful_3: 1 piaty: Stateles_2: 3 pierwszy: Stateles_1: 8 pierwszy: Stateful_4: 1 drugi: Stateful_3: 2 piaty: Stateful_5: 1 piaty: Stateful_5: 2 pierwszy: Stateful_4: 2 drugi: Stateful_3: 3 pierwszy: Stateful_4: 3 piaty: Stateful_5: 3 9

Cykl życia stanowego komponentu sesyjnego Egzemplarze stanowego komponentu sesyjnego są dedykowane konkretnemu klientowi niemożliwa jest wymiana i składowanie komponentów w puli. Nieużywane komponenty sesyjne są usuwane z pamięci. Aby nie stracić stanu konwersacji taki komponent jest uprzednio pasywowany. Cykl życia stanowego komponentu sesyjnego obejmuje trzy stany: nie istnieje, gotowy do obsługi zgłoszeń, pasywowany. 10

Cykl życia stanowego komponentu sesyjnego Class.newInstance() @PostConstruct wyczerpanie limitu czasowego metoda biznesowa nie istnieje @PreDestroy gotowy do obsługi @PrePasivate wyjątek wyczerpanie limitu czasowego pasywny @PostActivate 11

Wychodzenie ze stanu gotowy do obsługi Egzemplarz może przejść zarówno do stanu nie istnieje jak i pasywny. Pasywowanie i aktywowanie komponentu może być wykonywane dowolną liczbę razy w trakcie cyklu życia. Kontener wyprowadza komponent po wyczerpaniu limitów czasowych, które można określić w trakcie wdrażania poprzez mechanizmy określone przez producenta kontenera. Aplikacja kliencka może wymusić usunięcie obiektu wywołując metodę biznesową oznaczoną adnotacją @Remove. @Stateful public class TravelAgentBean implements TravelAgentRemote {... @Remove public TicketDO bookpassage(...){... 12

Interfejs SessionSynchronization Stanowy komponent sesyjny może obsługiwać zdarzenia związane ze zmianami stanów także poprzez interfejs javax.ejb.sessionsynchronization: void afterbegin() - po rozpoczęciu transakcji, void beforecompletion() - przed zakończeniem transakcji (commit), void aftercompletion(boolean) po zakończeniu transakcji z informacją o jej zakończeniu (commit - true) lub odwołaniu (rollback - false). 13

Stanowe komponenty sesyjne i kontekst utrwalania Domyślnie każda metoda składowa komponentu sesyjnego jest wykonywana w ramach transakcji inicjowanej i kończonej w zakresie metody utrwalana encja jest odłączana od kontekstu utrwalania z chwilą zakończenia przetwarzania wywołania metody. public void updateaddress(address addr) { this.customer.setaddress(addr); this.customer = entitymanager.merge(customer); 14

Stanowe komponenty sesyjne i kontekst utrwalania Aby związać zakres transakcji z istnieniem egzemplarza stanowego komponentu sesyjnego należy użyć rozszerzonego kontekstu transakcji. import static javax.persistence.persistencecontexttype.extended;... @Stateful public class TravelAgentBean implements TravelAgentRemote { @PersistenceContext(unitName="titan", type=extended) private EntityManager entitymanager;...... public void updateaddress(address addr) { customer.setaddress(addr); 15

Zagnieżdżanie stanowych komponentów sesyjnych Aby skorzystać z innych komponentów sesyjnych można użyć mechanizmu wstrzykiwania. @Stateful public class ShoppingCartBean implements ShoppingCart{... @EJB AnotherStatefulLocal another; @Remove void checkout() {...... Obiekt another jest tworzony w momencie utworzenia komponentu ShoppingCartBean. Wywołanie metody checkout() powoduje usunięcie tego obiektu. 16

Zagnieżdżanie stanowych komponentów sesyjnych @Stateful public class ShoppingCartBean implements ShoppingCart { @EJB AnotherStatefulLocal another; @PersistenceContext(unitName="titan", type=extended) private EntityManager entitymanager; @Remove void checkout() {... @Stateful public class AnotherStatefulBean implements AnotherStatefulLocal { @PersistenceContext(unitName="titan", type=extended) private EntityManager entitymanager;... Pola this.entitymanager i another.entitymanager zawierają referencję do tego samego kontekstu utrwalania. 17

package com.titan.travelagent; import com.titan.processpayment.creditcarddo; import javax.ejb.remote; import com.titan.domain.customer; import com.titan.domain.address; @Remote public interface TravelAgentRemote { TravelAgentBean public Customer findorcreatecustomer(string first, String last); public void updateaddress(address addr); public void setcruiseid(int cruise); public void setcabinid(int cabin); public TicketDO bookpassage(creditcarddo card, double price) hrows IncompleteConversationalState; 18

TravelAgentBean package com.titan.travelagent; import com.titan.processpayment.*; import com.titan.domain.*; import javax.ejb.*; import javax.persistence.*; import java.util.date; @Stateful public class TravelAgentBean implements TravelAgentRemote { @PersistenceContext(unitName="titan") private EntityManager entitymanager; @EJB private ProcessPaymentLocal processpayment; private Customer customer; private Cruise cruise; private Cabin cabin; 19

TravelAgentBean public Customer findorcreatecustomer(string first, String last){ try { Query q = entitymanager.createquery( "from Customer c where c.firstname = :first and c.lastname = :last"); q.setparameter("first", first); q.setparameter("last", last); this.customer = (Customer)q.getSingleResult(); catch (NoResultException notfound) { this.customer = new Customer(); this.customer.setfirstname(first); this.customer.setlastname(last); entitymanager.persist(this.customer); return this.customer; public void updateaddress(address addr) { this.customer.setaddress(addr); this.customer = entitymanager.merge(customer); 20

TravelAgentBean public void setcabinid(int cabinid) { this.cabin = entitymanager.find(cabin.class, cabinid); if (cabin == null){ throw new NoResultException("Cabin not found"); public void setcruiseid(int cruiseid) { this.cruise = entitymanager.find(cruise.class, cruiseid); if (cruise == null) { throw new NoResultException("Cruise not found"); 21

TravelAgentBean @Remove public TicketDO bookpassage(creditcarddo card, double price) throws IncompleteConversationalState { if (customer == null cruise == null cabin == null){ throw new IncompleteConversationalState( ); try { Reservation reservation = new Reservation( customer, cruise, cabin, price, new Date( )); entitymanager.persist(reservation); processpayment.bycredit(customer, card, price); TicketDO ticket = new TicketDO( customer, cruise, cabin, price); return ticket; catch(exception e) { throw new EJBException(e); 22

Podsumowanie Stanowe komponenty sesyjne wypełniają lukę pomiędzy usługami realizowanymi przez serwer (komponenty bezstanowe) a aplikacjami klienckimi, pozwalając na zredukowanie ich jedynie do warstwy prezentacji. 23