Usługa TimerService ejbtimeout() @javax.ejb.timeout



Podobne dokumenty
Komponenty sterowane komunikatami

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

Stanowe komponenty sesyjne

Enterprise JavaBeans

Wprowadzenie do Enterprise JavaBeans 2.0

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

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

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

Enterprise JavaBeans (EJB)

Aplikacje internetowe i rozproszone - laboratorium

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

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

Wzorce logiki dziedziny

Programowanie komponentowe 5

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

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

Enterprise Java Beans Narzędzia i Aplikacje Java EE

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

Podstawowe informacje o technologii Java EE 7

Remote Method Invocation 17 listopada 2010

Wywoływanie metod zdalnych

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Podejście obiektowe do budowy systemów rozproszonych

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ć

Zaawansowane aplikacje internetowe

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

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

Java wybrane technologie

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

Wywoływanie metod zdalnych

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

Programowanie obiektowe

Aplikacje RMI

Projektowanie Aplikacji Internetowych. Wzorce projektowe warstwy usług

Budowa komponentów Enterprise JavaBeans

Wykład 7: Pakiety i Interfejsy

Enterprise JavaBeans (EJB)

Aplikacje RMI Lab4

Programowanie obiektowe

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

Enterprise JavaBean 3.0

Java: interfejsy i klasy wewnętrzne

Dostęp do baz danych z aplikacji J2EE

Obsługa transakcji rozproszonych Java. Marek Wojciechowski, Maciej Zakrzewicz Instytut Informatyki, Politechnika Poznańska

Java wybrane technologie

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

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

Programowanie obiektowe

Platforma J2EE i EJB. Oprogramowanie systemów równoległych i rozproszonych Wykład 9. Rola EJB na platformie J2EE. Dr inż. Tomasz Olas olas@icis.pcz.

Metody dostępu do danych

1 Wprowadzenie do J2EE

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

EJB 2.x oraz zmiany w standardzie dla EJB 3.0. Michał Stanek

1 Atrybuty i metody klasowe

EJB 3.0 (Enterprise JavaBeans 3.0)

Zastosowanie komponentów EJB typu Session

Tworzenie aplikacji dla Oracle Application Server 10g R3 w technologii EJB 3.0

Programowanie obiektowe

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

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Tworzenie i wykorzystanie usług

Szkolenie wycofane z oferty. Program szkolenia: Enterprise Java Beans 3.0/3.1

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Transakcje w systemach Java Enterprise Korzystanie z systemów kolejkowania w serwerach aplikacji

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

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.

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

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

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

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

Java wybrane technologie

Kurs WWW. Paweł Rajba.

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Dokumentacja do API Javy.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java JMX. Marcin Werla. Monitorowanie i zarządzanie usługami sieciowymi w Javie. mwerla@man.poznan.pl PCSS/Poznań JUG

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Systemy Rozproszone - Ćwiczenie 6

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

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

Budowa aplikacji wielowarstwowych. Obsługa zdarzeń, zastosowanie walidatorów, wykonanie listy typu Drop Down List.

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

Spring Web MVC, Spring DI

"Biznesowe" wzorce projektowe

Enterprise JavaBeans 3.0

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

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

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Tworzenie komponentów logiki biznesowej i warstwy dostępu do danych w oparciu o EJB3.0/JPA lub EJB 3.1/JPA2

Aplikacje w środowisku Java

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

Programowanie komponentowe

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Wzorce dystrybucji i wspólbieżności autonomicznej

Platformy Technologiczne

Platformy Programistyczne Podstawy języka Java

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o.

Zaawansowane aplikacje WWW - laboratorium

Transkrypt:

TimerService i JNDI 1. Usługa TimerServiece, interfejsy TimedObject, TimerService, Timer, TimerHandle transakcje, zastosowanie usługi w komponentach EJB, cykl życia EJB, problemy. 2. Zasoby JNDI i wstrzykiwanie, wypełnianie Enterpise Naming Context, odwołania do JNDI, rodzaje wsztrzyknięć. 1

Usługa TimerService Aplikacje biznesowe często wykorzystuj ą systemy harmonogramowania, które s ą odpowiedzialne przykładowo za: generowanie raportów, cykliczne operacje na danych, wykonywanie audytów. Usługa Timer Service kontenera EJB udostępnia interfejs zdarze ń okresowych. Licznik upływającego czasu jest związany z komponentem EJB i po upływie określonego limitu wywołuje na jego rzecz metod ę ejbtimeout() lub metod ę oznaczon ą adnotacj ą @javax.ejb.timeout. 2

Interfejs TimedObject Warunkiem korzystania przez komponent EJB z usługi Timer Service jest implementacja interfejsu: package javax.ejb; public interface TimedObject { public void ejbtimeout(timer timer) ; Przykład: @Stateless public class ShipMaintenanceBean implements ShipMaintenanceRemote, javax.ejb.timedobject { public void ejbtimeout(javax.ejb.timer timer) { // logika biznesowa... 3

Interfejs TimedObject Alternatywnie moż na skorzystać z adnotacji wybranej metody: @javax.ejb.timeout dla @Stateless public class ShipMaintenanceBean implements ShipMaintenanceRemote{ @Timeout public void maintenance(javax.ejb.timer timer) { // logika biznesowa... Metoda oznaczona t ą adnotacj ą musi posiadać sygnatur ę identyczn ą z przykładow ą metod ą maintance(). 4

Interfejs TimedObject Aby skorzystać z systemu harmonogramowania należy zdefiniować kiedy ma nastąpić powiadomienie. Przykład: // Utworzenie obiektu Calendar Calendar time = Calendar.getInstance( ); // aktualny czas time.add(calendar.date, 30); // dodanie 30 dni Date date = time.gettime( ); TimerService timerservice = // pobrany np. z EJBContext timerservice.createtimer( date, null); TimerService jest interfejsem poprzez który zarządzamy harmonogramem. 5

Interfejs TimerService package javax.ejb; public interface TimerService{ Timer createtimer(date initialexpiration, long intervalduration, Serializable info); Timer createtimer(date expiration, Serializable info); Timer createtimer(long initialduration, long intervalduration, Serializable info); Timer createtimer(long duration, Serializable info); Collection gettimers(); intervalduration liczba milisekund pomiędzy kolejnymi wywołaniami zdarzenia, info obiekt przekazywany przez referencje Timer wraz z każdym wywołaniem zdarzenia. 6

Wyjątki IllegalArgumentException brak daty (null) lub liczba ujemna określajaca czas, IllegalStateException metoda wywołana gdy instancja była w niewłaściwym stanie. Ogólnie wywołania mog ą nastąpić zewsząd poza metodami interfejsu EJBContext (setentitycontext(), setsessioncontext(), setmessagedrivencontext() itd.), EJBException błąd systemowy. 7

Odwołanie harmonogramu Aby anulować ustawiony wcześniej licznik czasu należy wywołać metod ę cancel(). Poniższy kod zawarty w metodzie clearschedule(), anuluje wszystkie ustawione wcześniej w ramach komponentu harmonogramy: @Stateless public class ShipMaintenanceBean { implements ShipMaintenanceRemote @Resource javax.ejb.timerservice timerservice; public void clearschedule() { for (Object obj : timerservice.gettimers()) { javax.ejb.timer timer = (javax.ejb.timer)obj; timer.cancel(); 8

Interfejs Timer package javax.ejb; public interface Timer { // Kasuje harmonogram public void cancel(); // Zwraca informacje związaną z harmonogramem w trakcie // jego stworzenia public java.io.serializable getinfo(); // Zwraca moment następnego zdarzenia public java.util.date getnexttimeout(); // Zwraca liczbę milisekund do następnego zdarzenia public long gettimeremaining(); //Get a serializable handle to the timer public TimerHandle gethandle(); 9

Interfejs TimerHandle Metoda gethandle() zwraca referencje do obiektu implementującego interfejs TimerHandle: package javax.ejb; public interface TimerHandle extends java.io.serializable { public Timer gettimer(); Jedyna metoda zwraca instancj ę Timer określając ą aktualny licznik czasowy. Referencja TimerHandle ma charakter lokalny i może być wymieniana pomiędzy komponentami w ramach kontenera EJB. 10

Transakcje Licznik czasowy jest tworzony w ramach bieżącej transakcji. Jeżeli transakcja zostanie wycofana (np. poprzez zgłoszenie wyjątku) licznik nie zostanie utworzony. Z tego powodu metody zwrotne komponentów, wywoływane na skutek wyzerowania odpowiednich liczników czasowych deklaruje si ę z atrybutem transakcji RequiresNew: @Timeout @TransactionAttribute(TransactionAttributeTypes.REQUIRES_NEW) public void timeoutmethod() {... 11

Bezstanowe komponenty sesyjne package com.titan.maintenance; import javax.ejb.remote; import java.util.date; @Remote public interface ShipMaintenanceRemote{ public void schedulemaintenance(string ship, String description, Date dateoftest); 12

Bezstanowe komponenty sesyjne package com.titan.maintenance; import javax.ejb.*; import java.util.date; import javax.annotation.resource; @Stateless public class ShipMaintenanceBean implements ShipMaintenanceRemote{ @Timeout public void maintenance(timer timer) { System.out.println("Wywołana metoda Timeout"); String scheduled = (String)timer.getInfo(); System.out.println(scheduled); 13

Bezstanowe komponenty sesyjne @Resource TimerService timerservice; public void schedulemaintenance(string ship, String description, Date dateof) { String item = ship + " podlega przeglądowi: " + description; for (Object obj : timerservice.gettimers()) { Timer timer = (Timer)obj; String scheduled = (String)timer.getInfo(); if (scheduled.equals(item)) { timer.cancel(); timerservice.createtimer(dateof, item); 14

Bezstanowe komponenty sesyjne Liczniki czasowe bezstanowych komponentów sesyjnych s ą związane z konkretnymi typami komponentów. Po wyzerowaniu licznika, kontener wybierze jeden spośród składowanych w puli komponentów i wywoła jego metod ę zwrotn ą. Każdy egzemplarz komponentu może obsługiwać żądania dowolnego klienta (w tym kontenera EJB). Komponent może uzyskać dostęp do TimerService zarówno w metodach @PostConstruct i @PreDestroy (choć jest to niezalecane) jak równie ż w metodach biznesowych. 15

Problemy z @PostConstruct 1. Nie wiadomo, czy metoda w ogóle zostanie wywołana. 2. Metoda może być wywoływana wiele razy, public class StatelessTimerBean implements TimedObject { static boolean istimerset = false; @Resource TimerService timerservice; @Resource SessionContext ctx; @PostConstruct public void init(){ if( istimerset == false) { long expirationdate = (Long)ctx.lookup("expirationDate"); timerservice.createtimer(expirationdate, null ); istimerset = true;... Powyższe rozwiązanie (statyczne flagi) nie pomoże w sytuacji gdy komponenty działaj ą w ramach kilku JVM. Usuwanie istniejących liczników jest i ustawianie nowego jest nieefektywne. 16

Cykl życia Class.newInstance() @PostConstruct metoda biznesowa Nie istnieje @PreDestroy W puli gotowych komponentów ejbtimeout() 17

Komponenty sterowane komunikatami Liczniki czasowe komponentów sterowanych komunikatami działaj ą podobnie jak w bezstanowych komponentach sesyjnych. @MessageDriven public class JmsTimerBean implements MessageListener { @Resource TimerService timerservice; public void onmessage(message message){ MapMessage mapmessage = (MapMessage)message; long date = 0; try { date = mapmessage.getlong("expirationdate"); catch(jmsexception e) { e.printstacktrace(); this.timerservice.createtimer(date, null ); @Timeout public void timeout( ){...... 18

Problemy TimerService Pomimo, ze liczniki czasowe s ą wartościowym dodatkiem do platformy EJB, posiadaj ą one liczne ograniczenia. Ich funkcjonalność jest znacznie mniejsza ni ż popularnego narzędzia cron. Standard nie przewiduje możliwości skonfigurowania i ustawienia licznika w momencie uruchomienia aplikacji. Ponadto, w trakcie obsługi zdarzenia, nie istnieje możliwość rozróżnienia liczników jednorazowych od cyklicznych. W związku z tym bardzo prawdopodobna jest zmiana specyfikacji usługi w przyszłych wersjach EJB lub JEE. 19

Zasoby JNDI i wstrzykiwanie Każdy kontener EJB dysponuje własnym rejestrem zwanym ENC (Enterprise Naming Context) implementowanym przez JNDI (Java Naming and Directory Interface). W kontekście ENC można umieszczać referencje do interfejsów EJB, kolejki i tematy obsługiwane przez JMS, źródła danych (zasoby JCA) oraz inne obiektowe zasoby jak równie ż typy proste. Zasoby mog ą być umieszczane w kontekście ENC poprzez deklaracje w plikach XML lub adnotacje w kodzie źródłowym. 20

Wypełnianie JNDI ENC <ejb-jar> <enterprise-beans> <session> <ejb-name>travelagentbean</ejb-name> <ejb-local-ref> <ejb-ref-name>ejb/processpayment</ejb-ref-name> <ejb-ref-type>session</ejb-ref-type> <local> com.titan.processpayment.processpaymentlocal </local> <ejb-link>processpaymentbean</ejb-link> </ejb-local-ref> </session> </enterprise-beans> </ejb-jar> Komponent TravelAgentBean będzie dysponował referencj ą do ProcessPaymentBean poprzez interfejs ProcessPaymentLocal. Komponent będzie dostępny poprzez nazw ą ejb/processpayment. 21

Wypełnianie JNDI ENC import javax.ejb.ejb; import javax.ejb.stateful; @Stateful @EJB(name="ejb/ProcessPayment", beaninterface=processpaymentlocal.class, beanname="processpaymentbean") public class TravelAgentBean implements TravelAgentRemote {... 22

Odwołanie do JNDI ENC Dostęp za pomoc ą jndi.lookup(): @Stateful public class TravelAgentBean implements TravelAgentRemote { public TicketDO bookpassage(creditcarddo card, double amount) { ProcessPaymentLocal payment = null; try { InitialContext ctx = new InitialContext(); payment = (ProcessPaymentLocal) ctx.lookup("java:comp/env/ejb/processpayment"); catch(namingexception ne){ throw new EJBException(ne); payment.process(card, customer, amount);... java:comp/env ścieżka do zasobów komponentu ( comp). 23

Odwołanie do JNDI ENC Dostęp za pomoc ą interfejsu EJBContext: @Stateful public class TravelAgentBean implements TravelAgentRemote { @Resource private javax.ejb.sessioncontext ejbcontext; public TicketDO bookpassage(creditcarddo card, double amount) { ProcessPaymentLocal payment = (ProcessPaymentLocal) ejbcontext.lookup("ejb/processpayment"); payment.process(card, customer, amount);... EJBContext może korzystać ze ścieżki względnej ejb/processpayment. 24

Odwołanie do JNDI ENC Dostęp za pomoc ą adnotacji ( com.titan.travelagentbean/payment): @Stateful public class TravelAgentBean implements TravelAgentRemote { @EJB private ProcessPaymentLocal payment;... lub te ż ( com.titan.travelagentbean/processpayment): @Stateful public class TravelAgentBean implements TravelAgentRemote { private ProcessPaymentLocal payment; @EJB public void setprocesspayment(processpaymentlocal payment){ this.payment = payment;... Drugi sposób jest szczególnie użyteczny w trakcie testów. 25

Odwołanie do JNDI ENC <ejb-jar> <enterprise-beans><session> <ejb-name>travelagentbean</ejb-name> <ejb-local-ref> <ejb-ref-name>processpayment</ejb-ref-name> <ejb-ref-type>session</ejb-ref-type> <local> com.titan.processpayment.processpaymentlocal </local> <ejb-link>processpaymentbean</ejb-link> <injection-target> <injection-target-class> com.titan.travelagent.travelagentbean </injection-target-class> <injection-target-name> payment </injection-target-name> </injection-target> </ejb-local-ref> </session></enterprise-beans> </ejb-jar> 26

Rodzaje wstrzyknięć komponenty EJB: @Target({TYPE, METHOD, FIELD) @Retention(RUNTIME) public @interface EJB { String name( ) default ""; // nazwa względem java:comp/env Class beaninterface( ) default Object.class; String beanname( ) default ""; String mappedname( ) default ""; // nazwa w globalnym // drzewie JNDI obiekt EntityManager: @Target({TYPE, METHOD, FIELD) @Retention(RUNTIME) public @interface PersistenceContext { String name( ) default ""; String unitname( ) default ""; // nazwa jednostki utrwalania // zdefiniowana w pliku persistance.xml PersistenceContextType type( ) default TRANSACTION; PersistenceProperty[] properties( ) default {; 27

Rodzaje wstrzyknięć obiekt EntityManagerFactory (uzyskiwany za poprzez JNDI): @Target({TYPE, METHOD, FIELD) @Retention(RUNTIME) public @interface PersistenceUnit { String name( ) default ""; String unitname( ) default ""; // nazwa jednostki utrwalania // zdefiniowana w pliku // persistance.xml przykład (JNDI): InitialContext jndicontext = new InitialContext( ); EntityManagerFactory titan = (EntityManagerFactory) jndicontext.lookup("java:comp/env/persistence/titandb"); 28

Rodzaje wstrzyknięć zasoby: @Target({TYPE, METHOD, FIELD) @Retention(RUNTIME) public @interface Resource { public enum AuthenticationType {CONTAINER, APPLICATION String name( ) default ""; Class type( ) default Object.class; AuthenticationType authenticationtype() default AuthenticationType.CONTAINER; boolean shareable( ) default true; String description( ) default ""; String mappedname( ) default ""; przykład: @Stateful @Resource(name="jdbc/OracleDB", type=javax.sql.datasource, mappedname="java:/defaultds") public class TravelAgentBean implements TravelAgentRemote {... 29

Rodzaje wstrzyknięć referencje do usług WebServices: @Target({TYPE, METHOD, FIELD) @Retention(RUNTIME) public @interface WebServiceRef { String name( ) default ""; String wsdllocation( ) default ""; Class type( ) default Object.class; Class value( ) default Object.class; String mappedname( ) default ""; przykład: @Stateful public class TravelAgentBean implements TravelAgentRemote { @WebServiceRef ProcessorService service; @WebServiceRef(ProcessorService.class) Processor endpoint;... 30

Podsumowanie Przedstawiono dwie usługi (TimerService i JNDI), które pomagaj ą przy tworzeniu aplikacji biznesowych. Pierwsza pozwala określać liczniki czasowe, potrzebne przy realizacji różnego rodzaju harmonogramów, druga udostępnia środowisko aplikacji poprzez które komponenty mog ą wymieniać si ę zasobami oraz uzyskiwać dostęp do różnorodnych funkcji zapewnianych przez kontener aplikacji. 31