Post on 10-May-2015
description
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
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
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
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
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
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.
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”
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?
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
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
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
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
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
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());
}
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
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
?? ? ?
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
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
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!
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
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
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...
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
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
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
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
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
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
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!
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
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
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
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
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
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
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!
OSGi Alliance Marketing © 2008-2011 . All Rights Reserved,
© IBM Corp. 2011Page 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