Modular EJBs in OSGi - Tim Ward
Upcoming SlideShare
Loading in...5
×
 

Modular EJBs in OSGi - Tim Ward

on

  • 6,265 views

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, ...

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

Statistics

Views

Total Views
6,265
Views on SlideShare
6,265
Embed Views
0

Actions

Likes
3
Downloads
179
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Modular EJBs in OSGi - Tim Ward Modular EJBs in OSGi - Tim Ward Presentation Transcript

  • Modular EJBs in OSGiTim WardIBM21 Sep 2011 OSGi Alliance Marketing © 2008-2010 . 1 PageCOPYRIGHT © 2008-2011 OSGi Alliance. All Rights Reserved, © IBM Corp. 2011 All Rights Reserved
  • 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
  • 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
  • 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
  • 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
  • EJB Views and OSGi servicesAn EJB view shares a number of concepts with an OSGiservice. 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
  • 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
  • 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 8 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved, © IBM Corp. 2011
  • 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 integrationMission StatementIntegrate OpenEJB with existing OSGi standards/Ariesfeatures to provide full support for Modular EJBs Page 9 OSGi Alliance Marketing © 2008-2011 . All Rights Reserved, © IBM Corp. 2011
  • 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
  • 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
  • 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
  • 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
  • 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 EJBModulefor(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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • Apache Aries –JTA integration• Aries contains a JTA Service implementation that uses Geronimos 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
  • 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
  • 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
  • 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
  • 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 • Dont 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
  • 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
  • EJBs and JPA – Container Managed(Extended Persistence Contexts)• Extended persistence contexts apply to Stateful Session beans (hence Aries JPA hasnt 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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