java ee | modular ejbs for enterprise osgi | tim ward
Post on 16-Apr-2017
2.437 Views
Preview:
TRANSCRIPT
PowerPoint-Prsentation
Modular EJBs in OSGi
Tim Ward
IBM
21 Sep 2011
OSGi Alliance Marketing 2008-2010 . All Rights Reserved
Page
Page
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
Agenda
A Quick EJB refresher
How EJBs might fit into OSGi
A case study in implementing Modular EJB
Proof that it really works
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
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
EJB Views and OSGi services
EJB ViewOSGi Service
CardinalityMay proxy one or many EJB objectsOne per registration or one per client bundle
LocationStored in JNDIStored in the OSGi service registry
InterfaceOne business interface per EJB viewOne service may expose many interfaces
LifecycleRelatively static once created, no reinjection, no notifications from JNDIDynamic, may be removed or modified and underlying dependencies may change
An EJB view shares a number of concepts with an OSGi service.
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 Servicesservice.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
Identifying EJB Bundles in OSGi
Requirement
EJB Bundles should be able to be valid EJB JARs
Fit with existing OSGi module types (e.g. WABs)
ProposalAdd a new header Export-EJB:
Identifies a bundle as an EJB-Bundle
Defines which EJBs are exposed as OSGi services
Pioneered by Glassfish Application ServerKnown to work good basis for a standard?
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 and Aries features to provide support for Modular EJBs
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
Working with EJB Bundles
Finding the EJBs
EJBs are defined in one of two ways
via annotations @Stateless
via XML ...
Requirement 1 says that EJB Bundles should put XML in META-INF/ejb-jar.xml (just like Java EE)
Finding the XML is non-trivial for OpenEJB in OSGi
Use the extender pattern to help OpenEJB out
Recognise bundles using Export-EJB header
Working with EJB Bundles
Finding the EJBs (2)
Finding Annotated EJBs much harder than for XML
Typically a OpenEJB 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:Try to scan the raw bundle bytes (if they exist!)No fragments, imports or bundle classpath
Implement an OSGi aware scanner
Apache Aries
Locating META-INF/ejb-jar.xml
OpenEJB allows us to build our own EJBModule representing the EJB Bundle
An EJBModule allows us to supply a URL to the EJB XML 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
Apache Aries
Writing an OSGi aware scanner
In OSGi 4.3 a new core API method was added
BundleWiring.listResources(String, String, int)
We can use this to build an OSGi specific Xbean scanner for our EJBModule
for(String resource : bundle.adapt(BundleWiring.class). listResources("/", "*.class", LISTRESOURCES_RECURSE)) { URL u = bundle.getResource(resource) readClassDef(u.openStream()); }
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
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 BundleEJB APILoggerBusinessAPI????
Apache Aries
Classloading for EJB Bundles
Clearly the OpenEJB EJBModule ClassLoader should be the EJB Bundle ClassLoader
OpenEJB relies on the fact that its internals are visible from the EJB JAR ClassLoader
No requirement for EJB Bundles to import OpenEJB
Make OpenEJB visible from Application ClassLoader
EJB BundleEJB APIBusinessAPI
EJB JAR ClassLoaderOpen EJB
Application ClassLoader
Page
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
Implementing EJBs in OSGi
EJBs are usually implemented using 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!
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 Proxy factory
EJB stubs can use any mixture of interfaces
Page
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
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...
Tx Client
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
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
EJBs and JPA
JPA replaced Entity Beans as the persistence strategy for Java EE
EJBs have tight integration with JPA
Injection via Annotations @PersistenceUnit
Injection via XML ...
JNDI lookup in java:comp/env
EJBs may use JPA in two ways
Application Managed
Container Managed
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
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.xml
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
Apache Aries
JPA (Application Managed)
Hide META-INF/persistence.xml from OpenEJB
Don't put the URL in the EJBModule
Override the OpenEJB validation failure, Aries JPA will provide the missing EntityManagerFactory!
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
EJBjava:comp
Extender
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
Apache Aries
JPA (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 EntityManagerRegister this EntityManager in the relevant part of java:comp/env
EJBjava:comp
Extender
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
Java EE Security
Java EE supports 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
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
Issues with OpenEJB in OSGi
OpenEJB makes extensive use of XBean internally to build things
This has the option of providing a ClassLoaderOpenEJB 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 starting OpenEJB
New JAXB code in OpenEJB needs delegating to a 2.1 JAXB implementation every time we build an app
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!
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
01.11.11
OSGi Alliance Marketing 2008-2011 . All Rights Reserved,
IBM Corp. 2011
Page
top related