Geschäftskomponenten mit EJB 3.1 Aktuelle Technologien zur Entwicklung verteilter Java-Anwendungen Kurt Fastner Sommersemester 2012
Inhalt Was ist EJB Die verschiedenen EJB-Typen/Komponenten Applikationsserver, EJB-Container und Dienste Fazit
Einleitung EJB seit 1998, Version 1.0 Ziele: Entwicklungszeiten verkürzen, Code und Fehler reduzieren Seit EJB 3.0 Ease of Development Seit EJB 3.1 Fokus auf erhöhter Flexibilität
Was ist EJB? Spezifikation und Teil von Java EE Programmiermodell für Unternehmensanwendungen Eigenschaften: komponentenbasiert, skalierbar, wiederstandsfähig
Was sind EJBs? Standardisierte server-seitige Komponenten Beinhalten die Geschäftslogik In verschiedenen Ausprägungen vorhanden Session Beans Entity Beans Message Driven Beans
Session Beans Session Beans Stateless Stateful Singleton Bestandteile Business Interfaces (optional) Bean Klasse Deployment Deskriptor (optional)
Session Beans Kern einer EJB Anwendung Nicht persistent Können als Fassade implementiert werden Können an Transaktionen teilnehmen
Business Interfaces Fachliche Schnittstelle für den Client Local Interface für lokale zugriffe (aus der gleichen Anwendung) Remote Interface für entfernte Zugriffe über RMI No-Interface Client View (EJB 3.1)
Remote Interface @Remote public interface Auskunft { public List<Artikel> sucheartikel(string name, String Hersteller); } [1] Pass by Value (Kopie) Serialisierbarkeit der Parameter ist erforderlich
Aufrufmodell Entfernt [1]
Local Interface @Local public interface AuskunftLocal { public List<Artikel> sucheartikel(string name, String Hersteller); } [1] Pass by Reference Wenn nur ein Local Interface deklariert werden soll ist die Annotation überflüssig
No-Interface Client View Kein Interface @LocalBean (optional) Verwässert Komponenteneigenschaften von EJBs Verwendung bei 1:1 Entsprechung Interface/Bean-Klasse
Aufrufmodell Lokal [1]
Bean Klasse Einziger nicht optionaler Teil Beinhaltet die angebotene Geschäftslogik Deklariert Bean-Typ Stateless Stateful Singleton
Stateless Session Beans @Local(AuskunftLocal.class) @Remote(Auskunft.class) @Stateless public class AuskunftBean implements Auskunft, AuskunftLocal {... } [1] Nimmt keinen clientbezogenen Zustand an Die Bean ist nur für 1 Aufruf an einen Client gebunden Werden in einem Instanzpool gehalten
Stateful Session Beans @Stateful public class BestellvorgangBean implements Bestellvorgang, BestellvorgangLocal {... } [1] Nehmen einen clientbezogenen Zustand an 1:1 Beziehung zwischen Client und Bean Aktivierung und Passivierung EJB-Container gesteuerte Transaktionen über mehrere Aufrufe
Singleton Session Beans Neu mit EJB 3.1 EJB konforme Umsetzung des Singleton Patterns Nur eine Instanz pro Applikation/JVM Ähnelt der Stateless Session Bean Konkurrierende Zugriffe können problematisch sein (Flaschenhals)
Singleton Session Bean @Singleton @Startup @DependsOn( ApplicationPropertyServiceBean ) public class SystemServiceBean { @Lock(LockType.READ) public foo() {...} } @Lock(LockType.WRITE) @AccessTimeout(value = 1000, unit = TimeUnit.MILLISECONDS) public void bar(){...}... [1]
Deployment Deskriptor XML Konfigurationsdatei Seit EJB 3.0 durch Annotationen abgelöst Für bestimmte Zwecke aber noch das (einzige) Mittel der Wahl globale Interceptoren kurzfristige Änderungen
Asynchrone Methodenaufrufe Seit EJB 3.1 verfügbar, vorher nur über Message Driven Beans realisierbar @Asynchronous an Methode/Klasse Unterschied mit oder ohne Rückgabewert
Asynchrone Methodenaufrufe @Singleton public class EineBean { } @Asynchronous public Future<Integer> komplizierteberechnung() {... return new AsyncResult<Integer>(ergebnis); }... [1]
Message Driven Beans Nachrichtenbasierte Kommunikation über Broker Technologieunabhängige, lose Kopplung Schnittstelle objektorientierte und restliche Welt Ähnelt der Stateless Session Bean
Entity Beans Seit EJB 3.0 nicht mehr existent Jetzt Persistent Entity und Teil der Java Persistence API (JPA) Von EJB unabhängig und auch Java SE tauglich Schnittstelle zwischen relationaler und objektorientierter Welt
Java EE - Applikationsserver Container für andere Container, bietet diesen bestimmte Dienste an Stellt Protokolle für Client-Kommunikation bereit [1]
EJB-Container [1] Bietet Dienste des AS und weitere den EJB- Komponenten an Stellt die Laufzeitumgebung der EJB- Komponenten einer Anwendung dar
Was bringt EJB? Dependency Injection (DI) / Inversion of Control (IOC) Convention over Configuration Dienste die vom EJB-Container und Applikationsserver zur Verfügung gestellt werden (Lebenszyklus-Management, etc.)
Dependency Injection @EJB, @Resource, @PersistenceUnit, @PersistenceContext @Stateless @Local( MySessionLocal ) public class MySessionBean implements MySessionLocal { @EJB private EJBToInject ejbtoinject; } public void dosomething() { this.ejbtoinject.calculate(); } [1]
JNDI - Namensdienst Verschiedene Namensräume (global; app; module) Registrierung beim JNDI-Namensdienst für jedes Business-Interface (Voll qualifiziert) No Interface Client-View : Bean wird registriert
JNDI - Lookup try { Properties p = new Properties(); // IP + PORT des JNDI - Dienstes p.put(context.provider_url, jnp://126.135.103.7:1042 ); // JNDI - Klasse JBoss - Applikationsserver p.put(context.initial_context_factory, org.jnp.interfaces.namingcontextfactory ); // Verbindung zum JNDI - Dienst herstellen. jndicontext = new InitialContext(p); } catch (Exception e) {... } // Verwendung des JNDI - Namensdienstes Object o = jndicontext.lookup(...); [1]
Konkurrierende Zugriffe handhaben Stateless Session Beans: Während einem Aufruf exklusiv Stateful Session Beans: 1:1 Beziehung Client - Bean Singleton Session Beans: deklarative oder programmatische Steuerung
Deklarative Transaktionalität EJB stellt per Annotation verschiedene Transaktions-Typen zur Verfügung Attribut Beschreibung NOT_SUPPORTED Transaktion nicht unterstützt SUPPORTS Transaktion unterstützt REQUIRED Transaktion erforderlich (default) REQUIRES_NEW Neue Transaktion erforderlich MANDATORY Bestehende Transaktion erforderlich NEVER Bestehende Transaktion verboten [1]
Deklarative Transaktionalität @Stateless @TransactionAttribute(TransactionAttributeType.SUPPORTS) public class AuskunftBean implements Auskunft, AuskunftLocal {... @TransactionAttribute(TransactionAttributeType.NOT_SUPPORT ED) public List<Artikel> sucheartikel (String name) {... } [1]
Deklarative Sicherheit Einschränkung der Zugriffsrechte über Sicherheitsrollen Möglich auf Klassen- und Methoden- ebene Speziellere Konfigurationen überschreiben allgemeinere Annotation @RolesAllowed @PermitAll Beschreibung Definiert Rollen die auf annotierte Methoden/Klassen zugreifen dürfen Erlaubt jeglichen Zugriff ohne Einschränkungen @DenyAll Weist alle Aufrufe auf deklarierte Methoden ab. [1]
Deklarative Sicherheit @RolesAllowed({ CUSTOMER, EMPLOYEE }) public class ProtectedClassBean implements ProtectedClass, ProtectedClassLocal {... } @ PermitAll public void openmethod () {... } [1]
Interceptoren Umsetzung der Aspektorientierten Programmierung (AOP) in EJB Unterbrechen den eigentlichen Methodenaufruf Eingen sich für Querschnittsfunktionalitäten technisch (Logging, Profiling) fachlich (überprüfen von Berechtigungen)
Interceptor definieren public class BeanStatisticsInterceptor {... } @ AroundInvoke public Object onmethodecall(invocationcontext ctx) throws Exception { beanstats.reportmethodcall(ctx.getmethod()); long starttime = System.currentTimeMillis(); try { return ctx.proceed(); } finally { long duration = System.currentTimeMillis - starttime: beanstats.reportmethodduration(ctx.getmethod(), duration); } } [1]
Interceptoren anwenden @Stateless @Interceptors({BeanStatisticsInterceptor.class, SuperSecurity.class}) public class ZielobjektBean implements Zielobjekt { public void fangmichab() {...} @ExcludeClassInterceptors public void michnicht() {...} } [1] @Interceptors auch auf Methodenebene möglich
Timer Service Seit EJB 3.1 tauglicher Ersatz für cron automatische und programmgesteuerte Timer programmgesteuerte Timer können auf Ereignisse zur Laufzeit reagieren automatische Timer werden rein deklarativ festgelegt @Shedule(dayOfWeek= Mon-Fri,hour= 18 ) void machefeierabend(timer timer) {... } [1]
EJB - Lite Teil des Java EE Web-Profile Reduzierter Funktionsumfang auf Webanwendungen angepasst keine Entfernte Kommunikation keine Asynchronen Methodenaufrufe
EJB - Lite [2]
Fazit EJB 3.0 und 3.1 waren wichtige Schritte um die Technologie zu retten Erleichtert Einstieg in EAD für Neulinge Auch erfahrene Entwickler profitieren: weniger Aufwand und Fehler, clean Code,... Mächtiges und wohl vollständigstes Werkzeug im Java Umfeld
Quellen [1] EJB 3.1 professionell; dpunkt.verlag; Ihns [2] JavaMagazin Spezial, Java EE 6; 12.2010