More Related Content Similar to Modular EJBs in OSGi - Tim Ward (20) Modular EJBs in OSGi - Tim Ward1. Modular EJBs in OSGi
Tim Ward
IBM
21 Sep 2011
OSGi Alliance Marketing © 2008-2010 . 1
Page
COPYRIGHT © 2008-2011 OSGi Alliance. All Rights Reserved, © IBM Corp. 2011
All Rights Reserved
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 2 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 3 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 4 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 5 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
6. EJB Views and OSGi services
An EJB view shares a number of concepts with an OSGi
service.
EJB View OSGi Service
Cardinality May proxy one or many One per registration or one
EJB objects per client bundle
Location Stored in JNDI Stored in the OSGi service
registry
Interface One business interface per One service may expose
EJB view many interfaces
Lifecycle Relatively static once Dynamic, may be removed
created, no reinjection, no or modified and underlying
notifications from JNDI dependencies may change
Page 6 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 7 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
8. Identifying EJB Bundles in OSGi
Requirement
1) EJB Bundles should be able to be EJB JARs as well
2) 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 8 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 Statement
Integrate OpenEJB with existing OSGi standards/Aries
features to provide full support for Modular EJBs
Page 9 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 10 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 11 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 12 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 13 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 14 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 15 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 API
Business
API
EJB Bundle
? Logger
? ? ?
Page 16 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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
Business
API
EJB JAR ClassLoader
EJB Bundle Application ClassLoader
Open EJB
EJB API
Page 17 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 18 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 19 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
20. 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 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 21 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 22 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
23. 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 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 24 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 25 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 26 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
27. 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 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
28. 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 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 29 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 30 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
31. 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 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 32 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 33 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 34 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 35 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
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 36 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011
37. References
Apache Aries: http://aries.apache.org/
Tim Ward: @TimothyWard timothyjward@apache.org
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
Page 37 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011