Top Banner
Professional Open Source™ © JBoss, Inc. 2003-2005. 1 10/30/2007 Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework developers
72

Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

Jul 23, 2018

Download

Documents

dinhcong
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

Professional Open Source™

© JBoss, Inc. 2003-2005. 110/30/2007

Practical EJB 3.0

Bill BurkeJBoss FellowRed Hat

Easier for application and framework developers

Page 2: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 2

Professional Open Source™

Agenda

Using EJB with JPA

– How EJBs makes JPA easier for application developers

Practical usage of EJB Interceptors

– How EJBs makes it easier for framework developers

Page 3: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 3

Professional Open Source™

Speaker’s Qualifications

JBoss contributor since 2001

Lead JBoss EJB 3.0 project

EJB, JPA, and Java EE JSRs

Author O’Reilly’s EJB 3.0 5th edition

Most importantly….

– Of Polish decent

Page 4: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

Professional Open Source™

© JBoss, Inc. 2003-2005. 410/30/2007

Using EJB 3.0 with JPA

Ease of use

Page 5: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 5

Professional Open Source™

JPA Overview

Java Persistence API is an object-relational mapping layer

Allows you to map plain Java classes to a relational database

– Really a standardization of popular ORM tools like Hibernate and Toplink

@EntityPublic class Customer {

@Id @GeneratedValueprivate int id;

private String name;private String address;

public getId() { return id; }public void setId(int id) { this.id = id; }

…}

Page 6: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 6

Professional Open Source™

JPA Overview

The EntityManager interface manages entity bean instances

– Analogous to the Hibernate Session

Entity bean instances must be associated with an EntityManagerinstance to be persistable

– Otherwise they are just plain Java objects

Entity instances associated with an EntityManager are watched

– Changes to object are persisted

Page 7: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 7

Professional Open Source™

JPA Overview

The EntityManager interface manages entity bean instances

– Analogous to the Hibernate Session

Lifecycle must be maintained by user code

Page 8: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 8

Professional Open Source™

JPA Overview

EntityManagerFactory factory = Persistence.createEntityManagerFactory(…);

try {EntityManager em = factory.createEntityManager();

Customer cust = new Customer();cust.setName(“Bill”);

try {em.getTransaction().begin();em.persist(cust);em.getTransaction().commit();

} catch (Exception ex) {em.rollback();

} finally {em.close();

}} finally {

factory.close();}

Page 9: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 9

Professional Open Source™

It’s a little painful to…

Manage the lifecycle of EntityManager and EntityManagerFactory

– Tons of try/catch blocks

Manage your own local entity transactions

Pass EntityManager instances around

– If other objects/methods interact within the same transaction

Page 10: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 10

Professional Open Source™

EJBs to the rescue

EJBs can

– Easily reference EntityManager instances

– Manage EntityManager lifecycle

– Automatically associate EntityManager with JTA transactions

– Propagate EntityManager instances automatically between nested component calls

Page 11: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 11

Professional Open Source™

EJBs to the rescue

public interface CustomerRegistry {public void createCustomer(String name, String address);

}

@Statelesspublic class CustomerRegistryBean implements CustomerRegistry{

@PersistenceContext EntityManager em;

public void createCustomer(String name, String address) {Customer cust = new Customer(name, address);em.persist(cust);

}}

Page 12: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 12

Professional Open Source™

EJBs to the rescue

@PersistenceContext gives us a reference to an EntityManager

Bean methods automatically start/end a JTA transaction

Lifecycle of EntityManager managed by EJB

– EntityManager instance created for duration of JTA transaction

– Destroyed at the end of the JTA transaction

EntityManager instance is automatically associated with the transaction

– This means that any other EJB that uses an EntityManager injected with @PersistenceContext in the same transaction, will use the same persistent session

– You don’t have to pass around EntityManager instances to EJBs that are within the same transaction

– (Very similar to using a JTA enabled JDBC connection)

Page 13: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 13

Professional Open Source™

Transaction Scoped EntityManagers

@PersistenceContext injected is a transaction-scoped EntityManager

– EntityManager instance destroyed at end of the transaction

– Entities being managed by EntityManager become plain pojos

• If you modify them, changes will not be automatically persisted

Page 14: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 14

Professional Open Source™

Extended EntityManagers

Extended EntityManagers can be injected into Stateful Session Beans

The EntityManager instance becomes tied with SFSB lifecycle

– Lives and dies with the SFSB instance

Page 15: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 15

Professional Open Source™

Extended EntityManagers and SFSBs

@Statefulpublic class ShoppingCart implements ShoppingCart {

@PersistenceContext(type=EXTENDED) EntityManager em;private Customer customer;

public void setCustomer(String name) {Query q = em.creatQuery(

“Select c from Customer where name=‘” + name + “’”);this.customer = (Customer)q.getSingleResult();

}

public void updateAddress(String address) {customer.setAddress(address);

}…

}Change is

automatically

persisted

Page 16: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 16

Professional Open Source™

Buffering Database Updates

Interacting with an Extended persistence context outside of a transactions queues any updates/inserts/deletes

You could use this within a web application

– Page 1: create the customer

– Page 2: create the order

– Page 3: Shop and add to cart

– Page 4: Submit order

Page 17: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 17

Professional Open Source™

Buffering Database Updates

@Statefulpublic class ShoppingCart implements ShoppingCart {

@PersistenceContext(type=EXTENDED) EntityManager em;private Customer customer;private Order order;

@TransactionAttribute(NOT_SUPPORTED)public void setCustomer(String name) {

Query q = em.creatQuery(“Select c from Customer where name=‘” + name + “’”);

this.customer = (Customer)q.getResultList().get(0);if (this.customer == null) {

this.customer = new Customer(name);em.persist();

}}

…}

Change not persisted

Page 18: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 18

Professional Open Source™

Buffering Database Updates

@Statefulpublic class ShoppingCart implements ShoppingCart {

@TransactionAttribute(NOT_SUPPORTED)public void startShopping() {

this.order = new Order();this.order.setCustomer(this.customer);em.persist(this.order);

}

@TransactionAttribute(NOT_SUPPORTED)public void addToCart(Product product, int quantity) {

OrderEntry entry = new OrderEntry(product, quantity);this.order.addEntry(entry);

}

@Removepublic void checkout() {

em.flush(); // commit all changes}

}

Changes finally

persisted

Page 19: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 19

Professional Open Source™

Summary

EJBs are easy to write

EJBs provide nice persistence context management

– Lifecycle of EntityManagers is transparent

– Transaction Association

– Buffered Database Updates

Page 20: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

Professional Open Source™

© JBoss, Inc. 2003-2005. 2010/30/2007

EJB 3.0 Interceptors

Ease of Extension

Page 21: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 21

Professional Open Source™

Interceptors Overview

EJB 3.0 specification formalizes interceptors

– Already available in proprietary products

Intercept incoming business method

– Server side only!

Intercept EJB lifecycle events

– create, destroy, activate, passivate

Page 22: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 22

Professional Open Source™

Purpose of Interceptors

Aspectizing your applications

Pluggable annotations

Ease of Extension

– Not just ease of use

– Framework for frameworks

Page 23: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 23

Professional Open Source™

Simple example: Method Profiling

@Statelesspublic class BankAccountBean implements BankAccount {

@PersistenceContext EntityManager entityManager;

public void withdraw(int acct, double amount) {

long start = System.currentTimeMillis();try {

Account account = entityManager.find(…);validateWithdrawal(account, amount);account.withdraw(amount);

} finally {long time = System.currentTimeMillis() – start;System.out.println(“withdraw took” + time);

}}

}

Page 24: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 24

Professional Open Source™

What’s wrong with the example?

Bloated code

– Profiling has nothing to do with business logic

Difficult to enable/disable profiling

Impossible to extend profiling behavior transparently

Page 25: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 25

Professional Open Source™

Interceptors to the Rescue

Provides structure where none exists in OOP

Encapsulates profiling logic in one class

– Easier to extend

– Easier to debug

Facilities to transparently apply profiling logic

– Easy to apply profiling logic

Page 26: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 26

Professional Open Source™

Interceptor Implementation

public class ProfilingInterceptor {

@AroundInvokepublic Object profile(InvocationContext invocation)

throws Exception{

long start = System.currentTimeMillis();

try {return invocation.proceed();

} finally {long time = System.currentTimeMillis() – start;Method method = invocation.getMethod();System.out.println(method.toString() +

“ took “ + time + “ (ms)”);}

}}

Page 27: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 27

Professional Open Source™

@AroundInvoke method

Intercepts business method invoked

Called in chain of other applied interceptors

In same Java call stack as bean method

– Wraps around

– Thrown bean exceptions may be caught

Page 28: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 28

Professional Open Source™

javax.interceptor.InvocationContext

Abstraction for invoked bean method

public interface InvocationContext {public Object getTarget();public Method getMethod();public Object[] getParameters();public void setParameters(Object[] params);public Map<String, Object> getContextData();public Object proceed();

}

Must always be called at the end of the interceptor implementation in order to proceed.

Page 29: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 29

Professional Open Source™

InvocationContext usage

public class ProfilingInterceptor {

@AroundInvokepublic Object profile(InvocationContext invocation)

throws Exception {

long start = System.currentTimeMillis();

try {return invocation.proceed();

} finally {long time = System.currentTimeMillis() – start;Method method = invocation.getMethod();System.out.println(method.toString() +

“ took “ + time + “ (ms)”);}

}}

Page 30: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 30

Professional Open Source™

InvocationContext usage

public class ProfilingInterceptor {

@AroundInvokepublic Object profile(InvocationContext invocation)

throws Exception {

long start = System.currentTimeMillis();

try {return invocation.proceed();

} finally {long time = System.currentTimeMillis() – start;Method method = invocation.getMethod();System.out.println(method.toString() +

“ took “ + time + “ (ms)”);}

}}

Call next interceptor or invoke bean method

Page 31: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 31

Professional Open Source™

InvocationContext usage

public class ProfilingInterceptor {

@AroundInvokepublic Object profile(InvocationContext invocation)

throws Exception {

long start = System.currentTimeMillis();

try {return invocation.proceed();

} finally {long time = System.currentTimeMillis() – start;Method method = invocation.getMethod();System.out.println(method.toString() +

“ took “ + time + “ (ms)”);}

}}

Returns object representation of bean

method result

Page 32: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 32

Professional Open Source™

Interceptor Details

Runs in same transaction and security context as EJB method

Supports XML and annotation driven dependency injection

Belongs to the same ENC as intercepted EJB

Page 33: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 33

Professional Open Source™

Interceptor Lifecycle

Interceptor instance instantiated at same time as bean instance

Pooled along with bean instance

Destroyed when bean destroyed

Side effect? They can hold state

Page 34: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 34

Professional Open Source™

Evolving Profiler

public class ProfilingInterceptor {@Resource SessionContext ctx;@PersistenceContext EntityManager manager;

@AroundInvokepublic Object profile(InvocationContext invocation)

throws Exception {long start = System.currentTimeMillis();

try {return invocation.proceed();

} finally {long time = System.currentTimeMillis() – start;Profile profile = new Profile(

time, invocation.getMethod(),ctx.getPrincipal();

}manager.persist(profile);

}}

}

Page 35: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 35

Professional Open Source™

Evolving Profiler

public class ProfilingInterceptor {

@EJB Profiler profiler;

@AroundInvokepublic Object profile(InvocationContext invocation)

throws Exception {long start = System.currentTimeMillis();

try {return invocation.proceed();

} finally {long time = System.currentTimeMillis() – start;profiler.log(invocation, time);

}}

}

Page 36: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 36

Professional Open Source™

XML: Annotation Alternative

<ejb-jar><interceptors>

<interceptor><interceptor-class>

org.jboss.ProfilerInterceptor</interceptor-class><around-invoke>

<method-name>profile</method-name></around-invoke><ejb-ref>…

</ejb-ref><env-entry>…

</env-entry></interceptor>

</interceptors></ejb-jar>

Page 37: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 37

Professional Open Source™

Applying Interceptors

Through annotations

– @javax.interceptor.Interceptors

Through explicit XML

– ejb-jar.xml

Through default XML

– Default interceptors

Page 38: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 38

Professional Open Source™

Applying Interceptors

@Stateless@Interceptors(org.jboss.ProfilingInterceptor.class)public class BankAccountBean implements BankAccount {

@PersistenceContext EntityManager entityManager;

public void withdraw(int acct, double amount) {

Account account = entityManager.find(…);validateWithdrawal(account, amount);account.withdraw(amount);

}}

Accepts an array of interceptor

classes

Page 39: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 39

Professional Open Source™

@Interceptors on Class

One or more can be applied

Every business method is intercepted

Executed in order they are declared

Page 40: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 40

Professional Open Source™

Binding through XML

<ejb-jar><assembly-descriptor>

<interceptor-binding><ejb-name>BankAccountBean</ejb-name><interceptor-class>

org.jboss.ProfilingInterceptor</interceptor-class>

</interceptor-binding></assembly-descriptor>

</ejb-jar>

Page 41: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 41

Professional Open Source™

Binding through XML

<ejb-jar><assembly-descriptor>

<interceptor-binding><ejb-name>BankAccountBean</ejb-name><interceptor-class>

org.jboss.ProfilingInterceptor</interceptor-class>

</interceptor-binding></assembly-descriptor>

</ejb-jar>

Multiple <intereptor-class>

entries allowed

Page 42: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 42

Professional Open Source™

Binding through XML

<ejb-jar><assembly-descriptor>

<interceptor-binding><ejb-name>BankAccountBean</ejb-name><interceptor-class>

org.jboss.ProfilingInterceptor</interceptor-class>

</interceptor-binding></assembly-descriptor>

</ejb-jar>This is a complete

descriptor!

Page 43: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 43

Professional Open Source™

Per-method interception

Interceptors can be applied per-method

Bean method is annotated

Executed after any class level interceptors

Page 44: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 44

Professional Open Source™

Applying Per-Method Interceptors

@Statelesspublic class BankAccountBean implements BankAccount {

@PersistenceContext EntityManager entityManager;

public void withdraw(int acct, double ammount) {…

}

@Interceptors(org.jboss.ProfilingInterceptor.class)public void debit(int acct, double amount) {

…}

}

Page 45: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 45

Professional Open Source™

Binding through XML

<ejb-jar><assembly-descriptor>

<interceptor-binding><ejb-name>BankAccountBean</ejb-name><interceptor-class>

org.jboss.ProfilingInterceptor</interceptor-class><method>

<method-name>debit</method-name></method>

</interceptor-binding></assembly-descriptor>

</ejb-jar>

Page 46: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 46

Professional Open Source™

Default Interceptors

A set of interceptors can be assigned to every EJB

– Per deployment only

– Simple ejb-jar.xml description

‘*’ wildcard in <ejb-name>

Page 47: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 47

Professional Open Source™

Binding through XML

<ejb-jar><assembly-descriptor>

<interceptor-binding><ejb-name>*</ejb-name><interceptor-class>

org.jboss.ProfilingInterceptor</interceptor-class>

</interceptor-binding></assembly-descriptor>

</ejb-jar>

Page 48: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 48

Professional Open Source™

Interceptor Exception Handling

Allowed to abort invocation

Allowed to catch and rethrow different exceptions

Allowed to catch and retry invocation

Page 49: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 49

Professional Open Source™

Aborting an Invocation Usecase

We’re a Billing ISV

Want to provide customizable validation

Turn on/off validation as needed

Configure validation parameters

Optional “enterpri$e” validation

– Pay more for fraud detection

Page 50: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 50

Professional Open Source™

Aborting an Invocation

public class WithdrawValidation {

@Resource(name=“maxWithdraw”)double maxWithdraw = 500.0;

@AroundInvokepublic Object profile(InvocationContext invocation)

throws Exception {

double amount = (Double)invocation.getParameters()[0];if (amount > maxWithdraw) {

throw new RuntimeException(“Max withdraw() is “ +maxWithdraw);

}return invocation.proceed();

}}

Page 51: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 51

Professional Open Source™

Configure the interceptor

<ejb-jar><session>

<ejb-name>BankAccountBean</ejb-name><env-entry>

<env-entry-name>maxWithdraw</env-entry-name><env-entry-type>java.lang.Double</env-entry-type><env-entry-value>10000.0</env-entry-value>

</env-entry></session>

…</ejb-jar>

Page 52: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 52

Professional Open Source™

Bind the interceptor

<ejb-jar><assembly-descriptor>

<interceptor-binding><ejb-name>BankAccountBean</ejb-name><interceptor-class>

org.billing.WithdrawValidation</interceptor-class><method>

<method-name>withdraw</method-name></method>

</interceptor-binding></assembly-descriptor>

</ejb-jar>

Page 53: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 53

Professional Open Source™

Swap in Fraud Detection

<ejb-jar><assembly-descriptor>

<interceptor-binding><ejb-name>BankAccountBean</ejb-name><interceptor-class>

org.billing.FraudDetection</interceptor-class><method>

<method-name>withdraw</method-name></method>

</interceptor-binding></assembly-descriptor>

</ejb-jar>

Page 54: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 54

Professional Open Source™

Aborting an Invocation Usecase

Augment Java EE base security

Use a Rule Engine

Examine content to determine if we’re allowed to invoke method

Page 55: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 55

Professional Open Source™

Aborting an Invocation

public class RuleBasedSecurity {

@EJB RulesEngine rules;

@AroundInvokepublic Object profile(InvocationContext invocation)

throws Exception {

if (!rules.authorized(invocation)) {throw new SecurityException(“Failed to authorize

based on content”);}return invocation.proceed();

}}

Page 56: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 56

Professional Open Source™

Exception Wrapping Usecase

Map SQLException to an exception hierarchy

Take vendor error numbers and convert them to:

– DeadlockException

– InvalidSqlException

– Etc…

Allow callers to catch concrete exceptions

– To handle specific db errors

– Vendor specific error handling abstracted

Page 57: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 57

Professional Open Source™

Exception Wrapping

public class SQLExceptionMapper {

@AroundInvokepublic Object profile(InvocationContext invocation)

throws Exception {

try {return invocation.proceed();

} catch (SQLException ex) {switch (ex.getErrorCode()) {case 3344:

throw new DeadlockException();case 4422:

throw new InvalidSqlException();…

}}

}

Page 58: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 58

Professional Open Source™

Exception Wrapping

@Stateless@Interceptors(org.jboss.jdbc.SQLExceptionMapper.class)public class MyDAOBean implements MyDao{

public List queryStuff() throws SQLException{

…}

}

Page 59: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 59

Professional Open Source™

Intercepting Lifecycle Events

Re-use callback annotations

– @PostConstruct, @PreDestroy, etc.

Same signature as @AroundInvoke methods

In same Java callbacks as bean callback methods

– If the bean has a callback method

Page 60: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 60

Professional Open Source™

Custom Injection Annotation

Java EE 5 has no defined annotation that can inject directly from Global JNDI

Let’s create a @JndiInjected annotation

– Use callback interception to implement

Page 61: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 61

Professional Open Source™

Custom Injection Annotation

@Statelesspublic class MyBean implements My {

@JndiInjected(“jboss/employees/bill/address”)Address billingAddress;

…}

Page 62: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 62

Professional Open Source™

Step 1: Define Annotation

package org.jboss;

@Target({FIELD}) @Retention(RUNTIME)public @interface JndiInjected {

String value();}

Page 63: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 63

Professional Open Source™

Step 2: Write the Interceptor

public class JndiInjector {

@PostConstructpublic void injector(InvocationContext inv) {

InitialContext ctx = new InitialContext();Object target = inv.getTarget();for (Field f : target.getClass().getFields()) {

JndiInjected ji = f.getAnnotation(JndiInjected.class);

if (ji != null) {Object obj = ctx.lookup(ji.value());f.set(target, ji);

}}inv.proceed();

}}

Page 64: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 64

Professional Open Source™

Step 3: Apply interceptor

<ejb-jar><assembly-descriptor>

<interceptor-binding><ejb-name>*</ejb-name><interceptor-class>

org.jboss.JndiInjector</interceptor-class>

</interceptor-binding></assembly-descriptor>

</ejb-jar>

Page 65: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 65

Professional Open Source™

Summary of Usecases

Apply orthogonal behavior transparently

– Method profiling

Aspectized exception handling

– Validation, fraud detection, custom security, jdbc wrapper

Custom injection annotations

Page 66: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 66

Professional Open Source™

Interceptors in Action

JBoss Business Activity

– Interceptors that perform compensating transactions

JBoss/Spring integration

– Deploy Spring packages

– Injected deployed Spring beans into EJB instances

JBoss Seam

– Integrates EJB with context of invocation

– Bi-ject HTTP Session attributes into your EJB instances

Page 67: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 67

Professional Open Source™

JBoss Business Activity Framework

@Statelesspublic class HotelReserverBean implements Hotel {

@BACompensatedBy(“cancel”)@BAResult(“reservation”)public Reservation book(int room, int customer) {…

}

public void cancel(@BAParam(“reservation”) Reservation reservation) {

…}

}

• Intercept methods annotated with @BACompensatedBy

• Log tagged parameters/results• Register a compensation method

Page 68: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 68

Professional Open Source™

JBoss Business Activity Framework

@Statelesspublic class HotelReserverBean implements Hotel {

@BACompensatedBy(“cancel”)@BAResult(“reservation”)public Reservation book(int room, int customer) {…

}

public void cancel(@BAParam(“reservation”) Reservation reservation) {

…}

}

• Gets invoked if business activity

aborts

Page 69: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 69

Professional Open Source™

EJB/Spring integration

@Statelesspublic class MyBean implements My {

@Spring(bean=“myBean”)Address billingAddress;

…} Spring beans packaged into your

own .jar files and deployed by a JBoss Deployer

Page 70: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 70

Professional Open Source™

JBoss Seam

@Statelesspublic class MyBean implements My {

@In @Out Model model;

public void action(String action) {if (model.getData() == something) {

model.setSomeData(“hello world”);}

}}

Push/pull “model” from

HTTP Session

Page 71: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 71

Professional Open Source™

Summary

Interceptors encapsulate cross-cutting concerns

EJB 3.0 is framework of frameworks

– Ease of extension

– Pluggable annotations

Already being used in OSS products

Page 72: Practical EJB 3 - PROIDEAdata.proidea.org.pl/jdd/2edycja/materialy/prezentacje/Bill_Burke.pdf · Practical EJB 3.0 Bill Burke JBoss Fellow Red Hat Easier for application and framework

© JBoss, Inc. 2003-2005. 72

Professional Open Source™

Shameless Plug

O’Reilly’s EJB 3.0 5th Edition

– By Bill Burke and Richard Monson-Haefel