Modular EJBs in OSGi - Tim Ward

37
COPYRIGHT © 2008-2011 OSGi Alliance. All Rights Reserved, © IBM Corp. 2011 Modular EJBs in OSGi Tim Ward IBM 21 Sep 2011 OSGi Alliance Marketing © 2008-2010 . All Rights Reserved Page 1

description

For a long time bytecode weaving in OSGi has been a cumbersome process. Using it's internal hooks Equinox has supported basic transformation since version 3.2, but there has still been no simple, standard way to enhance classes and add new dependencies to the bundle that contains them. The new OSGi WeavingHook whiteboard pattern, which allows any OSGi bundle, not just an Equinox framework extension, to weave classes from, and add dependencies to, other OSGi bundles. Also new in OSGi is the opportunity to scan the classpath of an OSGi bundle. Whilst the isolated, modular classpath of an OSGi bundle provides an excellent system for building Java applications, many extenders and libraries need to be able to search for classes or resources within the bundle. This function further aids weaving implementations by allowing them to search for resources, class and package name patterns, and other configuration without requiring specific metadata to be present. As the lead author for the Bytecode weaving design within the OSGi Alliance, and a committer in the Apache Aries project, Tim will use his expertise to demonstrate the power and flexibility of WeavingHooks, particularly in conjunction with the latest OSGi updates for classpath scanning. Drawing on real-world examples from the Apache Aries project Tim will use real-world examples to prove that first-class weaving .support is now available in OSGi

Transcript of Modular EJBs in OSGi - Tim Ward

Page 1: Modular EJBs in OSGi - Tim Ward

COPYRIGHT © 2008-2011 OSGi Alliance. All Rights Reserved, © IBM Corp. 2011

Modular EJBs in OSGi

Tim Ward

IBM

21 Sep 2011

OSGi Alliance Marketing © 2008-2010 . All Rights Reserved

Page 1

Page 2: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 2

Legal

• Java and all Java-based trademarks and logos are trademarks or registered trademarks of Oracle and/or its affiliates.

• OSGi and the OSGi logo are trademarks or registered trademarks of the OSGi Alliance

• Other product and service names might be trademarks of IBM or other companies. A current list of IBM trademarks is available on the Web at “Copyright and trademark information” at www.ibm.com/legal/copytrade.shtml

Page 3: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 3

Agenda

• A Quick EJB refresher

• How EJBs might fit into OSGi

• A case study in implementing Modular EJB

• Proof that it really works

Page 4: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 4

Terminology

• EJB – Enterprise Java Bean

• EJB JAR – A JAR packaging EJBs

• Modular EJB – An EJB running in OSGi

• EJB Bundle – An OSGi bundle packaging Modular EJBs

Page 5: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 5

EJBs – the basics

• EJBs are managed objects, the container injects their dependencies

• Session EJBs define one or more business “views”• These proxy the real EJB object(s)• The same view object may delegate to the same, or

a different, EJB for successive calls• Different EJB types have different delegation styles

• The EJB runtime adds declarative transactions, security and other services when a business method is called

Page 6: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 6

EJB Views and OSGi services

EJB View OSGi ServiceCardinality May proxy one or many

EJB objectsOne per registration or one per client bundle

Location Stored in JNDI Stored in the OSGi service registry

Interface One business interface per EJB view

One service may expose many interfaces

Lifecycle Relatively static once created, no reinjection, no notifications from JNDI

Dynamic, may be removed or modified and underlying dependencies may change

An EJB view shares a number of concepts with an OSGi service.

Page 7: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 7

Integrating EJBs with OSGi

• The service registry is the integration point in OSGi• Expose modular EJBs as OSGi services

• Register one service per EJB view• Remote EJB views should be Remoteable Services

• service.exported.interfaces = *

• EJB services only work with the right lookup lifecycle• Stateless are an interchangable pool• Singleton is like a normal service• Stateful EJBs are “one per lookup”

Page 8: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 8

Identifying EJB Bundles in OSGi

Requirement1) EJB Bundles should be able to be EJB JARs as well2) Fit with existing OSGi module definitions (e.g. WABs)

Proposal• Add a new header “Export-EJB:”

• Identifies a bundle as an EJB-Bundle• Defines which EJBs are exposed as OSGi services• Pioneered by Glassfish Application Server

• Known to work – good basis for a standard?

Page 9: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 9

Running Modular EJBs in Aries

• Apache Aries provides pieces of an OSGi container• Integrate with existing projects where possible

• OpenEJB has been packaged as an OSGi bundle for a couple of releases• Some tentative OSGi support, little true integration

Mission StatementIntegrate OpenEJB with existing OSGi standards/Aries features to provide full support for Modular EJBs

Page 10: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 10

Issues Running EJBs in OSGi

• Locating EJBs in OSGi bundles

• OSGi class loading semantics

• Building EJB proxy stubs

• Transaction Manager integration

• JPA integration

• Security integration

• Miscellaneous

Page 11: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 11

Working with EJB Bundles – Finding the EJBs

• EJBs are defined in one of two ways• via annotations• via XML in the EJB deployment descriptor

• In Java EE the XML deployment descriptor is called META-INF/ejb-jar.xml• Requirement 1 says that EJB Bundles do the same

• Locating the XML descriptor is non-trivial for OpenEJB• Candidate bundles specify Export-EJB header

Page 12: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 12

Working with EJB Bundles – Finding the EJBs (2)

• Finding Annotated EJBs much harder than XML• Typically a container “scans” the classpath by listing

files on the file system (using file: or jar: URLs)

• In OSGi there is no guarantee of the bundle being on the filesystem (or in its original layout)• Typical scanning breaks at this point, so either:

• Scan the raw bundle bytes, JAR format, but miss fragments, imports and the bundle classpath

• Implement an OSGi aware scanner

Page 13: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 13

Apache Aries –Locating META-INF/ejb-jar.xml

• OpenEJB allows us to build our own EJBModule representing the EJB Bundle

• An OpenEJB EJBModule allows us to supply a URL to the EJB deployment descriptor• This is parsed and processed by OpenEJB

• Aries makes all .xml files in META-INF available • Covers other Java EE specs• Covers OpenEJB config files

Page 14: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 14

Apache Aries –Implementing an OSGi aware scanner

• In OSGi 4.3 a new core API method was added• BundleWiring.listResources(String, String, int)

• We can plug an OSGi specific Xbean scanner into our EJBModule

for(String resource : bundle.adapt(BundleWiring.class). listResources("/", "*.class", LISTRESOURCES_RECURSE)) { URL u = bundle.getResource(resource) readClassDef(u.openStream());

}

Page 15: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 15

Issues Running EJBs in OSGi

• Locating EJBs in OSGi bundles

• OSGi class loading semantics

• Building EJB proxy stubs

• Transaction Manager integration

• JPA integration

• Security integration

• Miscellaneous

Page 16: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 16

Java EE vs OSGi class loading

• One of the key differences between OSGi and Java EE is how they load classes

• Java EE has a hierarchy of ClassLoader instances• EJB JAR → Application → EJB Container → Java

• OSGi has a ClassLoader network...

EJB Bundle

EJB API

Logger

BusinessAPI

?? ? ?

Page 17: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 17

Apache Aries – EJB Classloading for EJB Bundles• Clearly the OpenEJB EJBModule ClassLoader should

be the EJB Bundle ClassLoader

• OpenEJB relies on the fact that it is visible from the EJB JAR and Application ClassLoaders• No requirement for EJB Bundles to import OpenEJB• Make OpenEJB visible from Application ClassLoader

EJB Bundle

EJB API

BusinessAPIEJB JAR ClassLoader Open EJBApplication ClassLoader

Page 18: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 18

Issues Running EJBs in OSGi

• Locating EJBs in OSGi bundles

• OSGi class loading semantics

• Building EJB proxy stubs

• Transaction Manager integration

• JPA integration

• Security integration

• Miscellaneous

Page 19: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 19

Implementing EJBs in OSGi

• In general EJB views are implemented as proxy “stubs”• Implement a single business interface• May implement other container specific interfaces• Often implement javax.naming.Referencable

• Stubs may be dynamic proxys or generated classes• In either case they must be loaded as classes

• In OSGi each bundle has a different ClassLoader• There may not be any one bundle that can see all

the interfaces on the proxy!

Page 20: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011

Apache Aries –OSGi safe proxy classes• Aries contains an OSGi aware proxy implementation

• Supports dynamic interface implementation generation for one to N interfaces

• The proxy allows a parent bundle to be specified• The proxy understands that not all interfaces may be

visible to the bundle!

• Aries replaces the default OpenEJB JDK Proxy factory• EJB stubs can use any mixture of interfaces

Page 20

Page 21: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 21

Issues Running EJBs in OSGi

• Locating EJBs in OSGi bundles

• OSGi class loading semantics

• Building EJB proxy stubs

• Transaction Manager integration

• JPA integration

• Security integration

• Miscellaneous

Page 22: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 22

EJBs and Transactions

• EJBs have an extremely strong link with transactions• All invocations use a global transaction by default

• More complex interactions can be configured• EJBs can control their own transactions too

• In OSGi we use the JTA Service to get hold of a TransactionManager• OpenEJB knows nothing about this...

Page 23: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011

Apache Aries –JTA integration

• Aries contains a JTA Service implementation that uses Geronimo's transaction manager• Also provides a TransactionSynchronizationRegistry

• Aries overrides the OpenEJB transaction manager• Use the JTA Service• Provide the Tx Manager and Tx Registry

• This is a clean and well used plug point

Page 23

Page 24: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 24

Issues Running EJBs in OSGi

• Locating EJBs in OSGi bundles

• OSGi class loading semantics

• Building EJB proxy stubs

• Transaction Manager integration

• JPA integration

• Security integration

• Miscellaneous

Page 25: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 25

EJBs and JPA

• JPA replaced Entity Beans as the persistence strategy for Java EE

• EJBs have tight integration with JPA• Injection via Annotations• Injection via XML• JNDI lookup in java:comp/env

• EJBs may use JPA in two ways• Application Managed• Container Managed

Page 26: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 26

EJBs and JPA – Application Managed

• In Application managed JPA the EJB manages lifecycle• Responsible for creating and closing EntityManagers• Responsible for joining any active transactions

• Adds a dependency on a named persistence unit• Injects or looks up an EntityManagerFactory

• OpenEJB expects to find, create, and manage any persistence units in persistence.xml• ClassLoader problems make this impossible in OSGi

Page 27: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011

Apache Aries –Updates to Aries JPA container

• Aries JPA normally uses the Meta-Persistence header to locate persistence bundles in the framework

• Java EE also defines rules for finding persistence units• WARs in WEB-INF/classes, or in WEB-INF/lib• EJB JARs in META-INF

• Aries JPA already checks for Web-ContextPath• Add support for the Export-EJB header too

Page 27

Page 28: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011

Apache Aries –JPA integration (Application Managed)

• Hide META-INF/persistence.xml from OpenEJB• Don't put the URL in the EJBModule

• OpenEJB validates all EJBs to make sure that any persistence unit they use is available in the Application• Override this validation failure, Aries JPA will build it!

• Listen for the registration of OSGi persistence units• If the unit is used by an EJB then bind it into the right

place in java:comp/env

Page 28

Page 29: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 29

EJBs and JPA – Container Managed • In Container managed JPA the container manages

everything!• Tx integration• Creating and closing EntityManagers

• More importantly, the container propagates context• Different EJBs that use the same persistence unit in

a transaction will get the same EntityManager

• Aries JPA already supports this mode of operation for blueprint beans and OSGi service lookups• It does not support Extended Contexts!

Page 30: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 30

EJBs and JPA – Container Managed (Extended Persistence Contexts)• Extended persistence contexts apply to Stateful

Session beans (hence Aries JPA hasn't got them!)

• An Extended Persistence context may start before, and lives beyond the end of a transaction• It joins any active transaction when used

• It cannot replace an existing managed context• It can become the managed context for a given tx

• OpenEJB is required to support this mode of operation

Page 31: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011

Apache Aries –JPA integration (Container Managed)

• Replace the existing OpenEJB JPA context registry• Check for Aries JPA contexts and OpenEJB contexts• Cross register any created contexts so both agree!

• Listen for the registration of OSGi persistence units• If the unit is used as a managed context in an EJB

then create an OpenEJB managed EntityManager• Register this EntityManager in the relevant part of

java:comp/env

Page 31

Page 32: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 32

Issues Running EJBs in OSGi

• Locating EJBs in OSGi bundles

• OSGi class loading semantics

• Building EJB proxy stubs

• Transaction Manager integration

• JPA integration

• Security integration

• Miscellaneous

Page 33: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 33

Java EE Security

• Java EE supports fine-grained, role-based authorization• On Servlet methods• On EJB method calls

• OpenEJB provides a Security Service plugpoint• Allows third party authentication/authorization

engines to be used

• Aries has no security component - any volunteers?• OpenEJB can cope without a Security Service• No integration at this time

Page 34: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 34

Issues Running EJBs in OSGi

• Locating EJBs in OSGi bundles

• OSGi class loading semantics

• Building EJB proxy stubs

• Transaction Manager integration

• JPA integration

• Security integration

• Miscellaneous

Page 35: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 35

Issues with using OpenEJB in OSGi

• OpenEJB makes extensive use of XBean internally to build things• This has the option of providing a ClassLoader

• OpenEJB typically provides none

• OpenEjbVersion throws an ExceptionInInitializerError• Attempts to classpath scan for properties

• To work around these Aries has to extensively set the Thread Context ClassLoader when initializing OpenEJB• New JAXB code in OpenEJB needs delegating to a

2.1 JAXB implementation every time we build an app

Page 36: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 36

Summary

• There are a few rough edges• Some can easily be remedied in OpenEJB internals

• Some support is clearly missing, but could be added• Security, Messaging, EJB lite

• Broadly speaking, it works• And I can prove it!

• Apache Aries Blog sample with an EJB implemented comment service!

Page 37: Modular EJBs in OSGi - Tim Ward

OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,

© IBM Corp. 2011Page 37

References

Apache Aries: http://aries.apache.org/

Tim Ward: @TimothyWard [email protected]

OSGi and JPA on YouTube: http://www.youtube.com/user/EnterpriseOSGi

For more information on Enterprise OSGi take a look at Enterprise OSGi in Action :

http://www.manning.com/cummins