Overview

General

Configuration

Servers

Integrations

Community

Related Projects

Index

Feeds

 

OpenEJB 3.1

  • Release Date: October 22nd, 2008
  • Partial EJB 3.1 support
  • EJB 3.0 support
  • EJB 2.1 support
  • EJB 2.0 support
  • EJB 1.1 support

Download

OpenEJB Standlone Server

OpenEJB for Tomcat

EJB 3.1 and other examples (source included)

Source Code

Release Notes

Tested On

  Windows XP (JDK 1.5) Windows XP (JDK 1.6) Linux (JDK 1.5) Linux (JDK 1.6) Mac OSX (JDK 1.5) Mac OSX (JDK 1.6)
Embedded
Standalone
Tomcat 6.0.14
Tomcat 6.0.13
Tomcat 6.0.10
Tomcat 6.0.9
Tomcat 5.5.26
Tomcat 5.5.25
Tomcat 5.5.23
Tomcat 5.5.20

Change Summary

Major new features:

Significant Improvements:

  • EAR-style classpath application discovery groups individual modules as an EAR allowing sharing of persistence units and improved connector and custom MDB deployment.
  • Detection of EclipseLink, TopLink, and Hibernate as JPA providers to automatically adds the right persistence unit property to for wiring in the OpenEJB TransactionManager.
  • System Property and InitialContext property overriding now applies to persistence-unit properties and logging levels.
  • Login/logout now possible in an embedded scenario via InitialContext params and initialContext.close() respectively.
  • Complete overhaul of all client/server connection management dramatically increases performance.
  • Several new checks added to Application Validation ruleset, some reworked to give even more details.

EJB 3.1 Features

EJB 3.1 Singletons

Singletons are a new type of Session bean being added to the EJB 3.1 specification. As the name implies a javax.ejb.Singleton is a session bean with a guarantee that there is at most one instance in the application.

Singletons gives you some important things that are missing in EJB 3.0 and prior versions, such as the ability to have an EJB that is notified when the application starts and notified when the application stops, allowing you to do all sorts of things that previously could only be done with a load-on-startup servlet. Singletons also give provide a great place to hold data that pertains to the entire application and all users using it, without the need for a static. Additionally, Singleton beans have multi-threaded capabilities allowing them to be invoked by several threads at one time similar to a Servlet.

See the Singleton API and Singleton Example pages.

Embeddable for Testing and Java SE usage (proposed EJB 3.1 feature)

Over the years, OpenEJB has innovated the art of the embedded/Java SE EJB container usable as a plain library much the way an embedded databases work. In a simple 1, 2, 3 step of 1) add OpenEJB to your classpath, 2) add a META-INF/ejb-jar.xml containing at minimum "<ejb-jar/>", then 3) use the org.apache.openejb.client.LocalInitialContextFactory when creating your client InitialContext, you've got a Java SE EJB container that can be used in unit tests, your IDE, or anywhere you'd like to drop in EJB functionality. Configuration can be done through an openejb.xml file or can be encapsulated 100% in the test case through the parameters passed to the InitialContext. For example, to create a JTA DataSource for JPA usage, you can simply:

Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
p.put("movieDatabase", "new://Resource?type=DataSource");
p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");

Context context = new InitialContext(p);

See the examples zip for a dozen embedded testing examples that range from simple @Stateless beans to advanced transaction and security testing.

Collapsed EAR (EJBs in .WARs) (proposed EJB 3.1 feature)

Along the lines of the Tomcat integration where OpenEJB can be plugged into Tomcat, we've expanded the idea to also allow your EJBs to be plugged into your webapp. We call this innovative feature Collapsed EAR. In this style 100% of your classes, including your EJBs, can be packed into your WEB-INF/classes and WEB-INF/lib directories. The result is that your WAR file becomes a replacement for an EAR. Unlike an EAR, all multi-packaging and multi-classloader requirements are stripped away and collapsed down to one archive and one classloader all your components, EJBs or otherwise, can share.

Constructor Injection (proposed EJB 3.1 feature)

For those of you who would like to use final fields, wish to avoid numerous setters, or dislike private field injection and would like nothing more than to just use plan old java constructors, your wish has come true. This is a feature we intended to add to OpenEJB 3.0 but didn't have time for. We're happy to bring it to the OpenEJB 3.1 release and with a bit of luck and support from people like yourself, we'll see this as an EJB 3.1 feature as well.

@Stateless
public class WidgetBean implements Widget {

    @EJB(beanName = "FooBean")
    private final Foo foo;

    @Resource(name = "count")
    private final int count;

    @Resource
    private final DataSource ds;

    public WidgetBean(Integer count, Foo foo, DataSource ds) {
        this.count = count;
        this.foo = foo;
        this.ds = ds;
    }

    public int getCount() {
        return count;
    }

    public Foo getFoo() {
        return foo;
    }
}

General Features

EJB 3.0 Support

OpenEJB 3.1 supports the EJB 3.0 specification as well as the prior EJB 2.1, EJB 2.0, and EJB 1.1. New features in EJB 3.0 include:

  • Annotations instead of xml
  • No home interfaces
  • Business Interfaces
  • Dependency Injection
  • Interceptors
  • Java Persistence API
  • Service Locator (ala SessionContext.lookup)
  • POJO-style beans
  • JAX-WS Web Services

EJB 2.x features since OpenEJB 1.0 also include:

  • MessageDriven Beans
  • Container-Managed Persistence (CMP) 2.0
  • Timers

The two aspects of EJB that OpenEJB does not yet support are:

  • JAX-RPC
  • CORBA

CORBA support will be added in future releases. Support for the JAX-RPC API is not a planned feature.

EJB Plugin for Tomcat 6 and 5.5

OpenEJB 3.1 can be plugged into any Tomcat 6 or Tomcat 5.5 server, adding support for EJBs in Web Apps. War files themselves can contain EJBs and the Servlets can use new JavaEE 5 annotations, XA transactions, JPA, and JMS. Webapps can even support fat java clients connecting over HTTP.

Don't use EJBs?

No matter, adding OpenEJB to Tomcat gives Servlets several new Java EE 5 capabilities such as JPA, JAX-WS, JMS, J2EE Connectors, transactions, and more as well as enhancing the injection features of Tomcat 6 to now support injection of JavaEE objects like Topics, Queues, EntityManagers, JMS ConnectionFactories, JavaMail Sessions, as well as simpler data types such as Dates, Classes, URI, URL, List, Map, Set, Properties, and more. In the case of Tomcat 5.5 which doesn't support dependency injection at all, even more is gained.

Spring Integration

Add OpenEJB 3.1 to your Spring application to gain the ability for EJBs to be easily injected into Spring beans (and vice versa) and add Java EE 5 capabilities such as JPA, JAX-WS, JMS, J2EE Connectors, transactions, and security.

See the Spring page and Spring Example for an example.

Multicast Discovery

Add the openejb-multicast.jar to your OpenEJB distributions lib/ directory and gain the ability to use multicast discovery between clients and serves as well as between servers allowing for request failover to other discovered servers. Clients can discover and access servers with a new "multicast://239.255.3.2:6142" url as follows:

Properties p = new Properties();
p.put("java.naming.factory.initial", "org.apache.openejb.client.RemoteInitialContextFactory");
p.put("java.naming.provider.url", "multicast://239.255.3.2:6142");
InitialContext ctx = new InitialContext(p);

Runs on OSGi

All OpenEJB 3.1 binaries come with complete OSGi metadata and are usable as a bundle in any OSGi platform. Look for OpenEJB in the upcoming, OSGi-based ServiceMix 4 which is built on Apache Felix.

CMP via JPA

Our CMP implementation is a thin layer over the new Java Persistence API (JPA). This means when you deploy an old style CMP 1.1 or CMP 2.1 bean it is internally converted and ran as a JPA bean. This makes it possible to use both CMP and JPA in the same application without any coherence issues that can come from using two competing persistence technologies against the same data. Everything is ultimately JPA in the end.

Dependency Injection – Enums, Classes, Dates, Files, oh my.

Dependency Injection in EJB 3.0 via @Resource is largely limited to objects provided by the container, such as DataSources, JMS Topics and Queues. It is possible for you to supply your own configuration information for injection, but standard rules allow for only data of type String, Character, Boolean, Integer, Short, Long, Double, Float and Byte. If you needed a URL, for example, you'd have to have it injected as a String then convert it yourself to a URL. This is just plain silly as the conversion of Strings to other basic data types has existed in JavaBeans long before Enterprise JavaBeans existed.

OpenEJB 3.1 supports injection of any data type for which you can supply a JavaBeans PropertyEditor. We include several built-in PropertyEditors already such as Date, InetAddress, Class, File, URL, URI, Map, List, any java.lang.Enum and more.

MyBean.java
import java.net.URI;
import java.io.File;
import java.util.Date;

@Stateful 
public class MyBean {
    @Resource URI blog;
    @Resource Date birthday;
    @Resource File homeDirectory;
}

Dependency Injection – Generic Collections and Maps

Support for Java Generics makes the dependency injection that much more powerful. Declare an injectable field that leverages Java Generics and we will use that information to boost your injection to the next level. For example:

MyBean.java
import java.net.URI;
import java.io.File;

@Stateful 
public class MyBean {
    @Resource List<Class> factories;
    @Resource Map<URI, File> locations;
}

Dependency Injection – Custom Types

You can easily add your own types or override the way built-in types are handled and claim dependency injection as your own making it a critical part of your architecture. For example, let's register a custom editor for our Pickup enum.

import java.beans.PropertyEditorManager;

public enum Pickup {

    HUMBUCKER,
    SINGLE_COIL;

    // Here's the little magic where we register the PickupEditor
    // which knows how to create this object from a string.
    // You can add any of your own Property Editors in the same way.
    static {
        PropertyEditorManager.registerEditor(Pickup.class, PickupEditor.class);
    }
}
@Stateful
public class StratocasterImpl implements Stratocaster {

    @Resource(name = "pickups")
    private List<Pickup> pickups;
}

The META-INF/env-entries.properties

Along the lines of injection, one of the last remaining things in EJB 3 that people need an ejb-jar.xml file for is to supply the value of env-entries. Env Entries are the source of data for all user supplied data injected into your bean; the afore mentioned String, Boolean, Integer, etc. This is a very big burden as each env-entry is going to cost you 5 lines of xml and the complication of having to figure out how to add you bean declaration in xml as an override of an existing bean and not accidentally as a new bean. All this can be very painful when all you want is to supply the value of a few @Resource String fields in you bean class.

To fix this, OpenEJB supports the idea of a META-INF/env-entries.properties file where we will look for the value of things that need injection that are not container controlled resources (i.e. datasources and things of that nature). You can configure you ejbs via a properties file and skip the need for an ejb-jar.xml and it's 5 lines per property madness.

META-INF/env-entries.properties
blog = http://acme.org/myblog
birthday = 1954-03-01
homeDirectory = /home/esmith/

Support for GlassFish descriptors

Unit testing EJBs with OpenEJB is a major feature and draw for people, even for people who may still use other app servers for final deployment such as Geronimo or GlassFish. The descriptor format for Geronimo is natively understood by OpenEJB as OpenEJB is the EJB Container provider for Geronimo. However, OpenEJB also supports the GlassFish descriptors so people using GlassFish as their final server can still use OpenEJB for testing EJBs via plain JUnit tests in their build and only have one set of vendor descriptors to maintain.

JavaEE 5 EAR and Application Client support

JavaEE 5 EARs, RARs, and Application Clients can be deployed in addition to ejb jars. EAR support is limited to ejbs, application clients, RARs, and libraries; WAR files will be ignored unless embedded in Tomcat. Per the JavaEE 5 spec, the META-INF/application.xml and META-INF/application-client.xml files are optional.

Application Validation for EJB 3.0

Incorrect usage of various new aspects of EJB 3.0 are checked for and reported during the deployment process preventing strange errors and failures.

As usual validation failures (non-compliant issues with your application) are printed out in complier-style "all-at-once" output allowing you to see and fix all your issues in one go. For example, if you have 10 @PersistenceContext annotations that reference an invalid persistence unit, you get all 10 errors on the first deploy rather than one failure on the first deploy with 9 more failed deployments to go.

Validation output comes in three levels. The most verbose level will tell you in detail what you did wrong, what the options are, and what to do next... even including valid code and annotation usage tailored to your app that you can copy and paste into your application. Very ideal for beginners and people using OpenEJB in a classroom setting.

Some example output might look like the following. Here we illegally add some annotations to the "Movies" bean's interface as well as use the wrong annotations for various types of injection:

FAIL ... Movies:  @Stateful cannot be applied to an interface: org.superbiz.injection.jpa.Movies
FAIL ... Movies:  Missing required "type" attribute on class-level @Resource usage
FAIL ... Movies:  Mistaken use of @Resource on an EntityManagerFactory reference.  
                  Use @PersistenceUnit for ref "org.superbiz.injection.jpa.MoviesImpl/entityManagerFactory"
FAIL ... Movies:  Mistaken use of @PersistenceUnit on an EntityManager reference.  
                  Use @PersistenceContext for ref "org.superbiz.injection.jpa.MoviesImpl/entityManager"
WARN ... Movies:  Inoring @RolesAllowed used on interface org.superbiz.injection.jpa.Movies method deleteMovie.
                  Annotation only usable on the bean class.
WARN ... Movies:  Ignoring @TransactionAttribute used on interface org.superbiz.injection.jpa.Movies method addMovie.
                  Annotation only usable on the bean class.

JNDI Name Formatting

A complication when using EJB is that plain client applications are at the mercy of vendor's chosen methodology for how JNDI names should be constructed. OpenEJB breaks the mold by allowing you to specify the exact format you'd like OpenEJB to use for your server or any individual application. Supply us with a formatting string, such as "ejb/{ejbName}/{interfaceClass.simpleName}", to get a JNDI layout that best matches your needs.

Changelog

New Features:

issues.apache.org  (23 issues) 
Key Summary
OPENEJB-941 ConnectorModule discoverable via the classpath (rar files)
OPENEJB-935 Spring Integration
OPENEJB-933 Injection Support for JSF 1.2 ManagedBeans
OPENEJB-920 JDBC/DataSource based login module
OPENEJB-917 JAX-WS 2.1: Support for WebServiceContext.getEndpointReference()
OPENEJB-916 Local Client "java:comp/TransactionSynchronizationRegistry" lookup
OPENEJB-915 Local Client "java:comp/TransactionManager" lookup
OPENEJB-914 Local Client "java:comp/UserTransaction" lookup
OPENEJB-913 Client Connection Failover and Request Retry
OPENEJB-912 Client-side Connection Pool
OPENEJB-911 Graceful shutdown of client/server connections
OPENEJB-905 PersistenceUnit property overriding
OPENEJB-903 Multicast discovery and grouping
OPENEJB-898 Property overriding for logging configuration
OPENEJB-897 LocalInitialContext.close() to logout of embedded container
OPENEJB-896 VM-scoped Security for embedded scenarios
OPENEJB-895 Support ResourceAdapter without requiring the Geronimo TransactionManager implementation
OPENEJB-894 LocalInitialContext.close() to shutdown embedded container
OPENEJB-836 SIngleton Session Beans
OPENEJB-831 PersistenceModule discoverable via the classpath
OPENEJB-821 EAR-style aggregation of modules discovered in the classpath
OPENEJB-805 JMS runs port-free in embedded mode
OPENEJB-785 EJBd protocol over SSL

Improvements:

issues.apache.org  (34 issues) 
Key Summary
OPENEJB-818 CMP1.1 and CMP2.x beans not required to implement javax.ejb.EntityBean
OPENEJB-807 CMP2 EntityBean interface methods auto-implemented
OPENEJB-859 Improved validation for <home>, <remote>, <local-home>, <local>, <business-local> and <business-remote> elements
OPENEJB-799 Support META-INF/env-entry.properites as an alternative to META-INF/env-entries.properies
OPENEJB-948 Container AccessTimeout and TimeOut values expressible as text "200ms", "1 hour", "5 min", etc.
OPENEJB-936 Log Tomcat resources imported into OpenEJB
OPENEJB-934 Better support for external activemq.xml configuration
OPENEJB-800 Default env-entry-type to java.lang.String
OPENEJB-940 Severely improved client performance over ejbd
OPENEJB-857 Client connection KeepAlive
OPENEJB-893 Improved JavaAgent/JPA enhancement for Unit Tests
OPENEJB-938 Improved the validation check on methods to look for mismatched arguments or conflicting case
OPENEJB-856 Upgrade to OpenJPA 1.1.0
OPENEJB-825 Eliminate possible mismatch of TxRecovery flag between TransactionManager and Resources
OPENEJB-944 Allow value of server service "only_from" property to use comma, tab and newline as a separator
OPENEJB-826 Better detection of testing and embedded scenarios
OPENEJB-817 ID portion of property overriding no longer case sensitive
OPENEJB-937 Improved StatefulContainer instance caching
OPENEJB-829 Automatically add an @DeclareRole ref for any role listed in @RolesAllowed
OPENEJB-918 transaction logging is too intrusive by default
OPENEJB-904 Pluggable Client/Server connection strategies and factories
OPENEJB-814 CMP2 <cmp-field> declarations are optional
OPENEJB-810 CMP ejbPostCreate methods made optional
OPENEJB-946 Optimized annotation scanner to determine if a jar is an ejb jar more quickly
OPENEJB-812 Explicitly check for CMP/BMP ejbHome.remove(ejbObject) mistake
OPENEJB-801 Automatically set hibernate.transaction.manager_lookup_class for Hibernate
OPENEJB-828 @EJB(name) value used to resolve ambiguous refs
OPENEJB-943 Improved support for non-JMS Connectors
OPENEJB-939 Write the cmp mappings when openejb.descriptors.output is set to true
OPENEJB-881 Automatically set eclipselink.target-server for EclipseLink
OPENEJB-892 Remove ASM dependency
OPENEJB-820 Eliminate dynamic return type processing in generated select methods.
OPENEJB-899 Improved classpath configuration searching
OPENEJB-880 Automatically set toplink.target-server for TopLink

Tasks & Sub-Tasks:

issues.apache.org  (19 issues) 
Key Summary
OPENEJB-947 Command line tool for monitoring multicast heartbeat
OPENEJB-813 Example: CMP2 EntityBean
OPENEJB-348 Example: Minimal MessageDriven Bean via @MessageDriven
OPENEJB-850 Example: Singleton bean with bean vs container concurrency
OPENEJB-900 Example: Testing Security via InitialContext login/logout
OPENEJB-359 Example: Using JMS
OPENEJB-823 Print Service properties on debug
OPENEJB-839 Read and Write method locking
OPENEJB-841 Singleton @DependsOn load ordering
OPENEJB-840 Singleton @Startup load-on-startup
OPENEJB-837 Singleton Bean-Managed Concurrency
OPENEJB-838 Singleton Container-Managed Concurrency
OPENEJB-848 Validation: @TransactionAttribute mistakenly used on beans with Bean-Managed Transactions
OPENEJB-855 Validation: Init/Remove annotations not used on MessageDriven, Stateless, or Singleton beans
OPENEJB-677 Validation: PrePassivate/PostActivate not used on MessageDriven or Stateless
OPENEJB-844 Validation: Singleton @Lock annotation not used with Bean-Managed Concurrency
OPENEJB-846 Validation: Singleton mistakenly using @PrePassivate and @PostActivate
OPENEJB-808 Validation: Unused ejbCreate methods
OPENEJB-809 Validation: Unused ejbPostCreate methods

   

Apache OpenEJB is an project of The Apache Software Foundation (ASF)
Site Powered by Atlassian Confluence .
[ edit ]