Overview
If your goal is simply to unit test beans with remote interfaces, this is not the right example for you. The LocalInitialContextFactory completely supports remote interfaces and all spec required pass-by-value (serialization) semantics without the need for network sockets. This example shows the use of OpenEJB in an embedded environment where connection outside the
vm is required.
The Code
For this example we have a simple Stateful bean called TelephoneBean as defined below. As a simple way of demonstrating the state we have to methods: speak and listen. You call speak and pass in some text, then you call listen to get your answer.
bean
business interface
EJB3 Notes
The bean class uses the annotation @Remote but does not specify a list of interfaces as is normally required. Per EJB3 rules, if the bean implements exactly one business interface it may use @Remote with no other values and that business interface is then implied to be a remote business interface. The same rule applies to identical usage of @Local.
The critical thing to know is that if you add another interface the rules change and require that you specify both interfaces in the @Remote annotation as in @Remote({Telephone.class, SecondInterface.class}).
Embedding
We're going to embed OpenEJB3 into a plain JUnit TestCase as a simple means of demonstrating the remote capabilities. We'll do the embedding in our test setUp method, then will make two test methods:
- one for invoking the bean's remote interface via the LocalInitialContextFactory which goes straight against the embedded container system
- one for invoking the bean's remote interface via the RemoteInitialContextFactory which connects to a Socket and communicates to the embedded container system over the ejbd protocol.
setUp
LocalInitialContextFactory: making in-vm calls to a remote business interface
RemoteInitialContextFactory: making networked calls to a remote business interface
This is the part you would want to do in apps that are running a different VM than the one in which the ejb container is embedded. These "client" VMs need only have the the openejb-client jar in their classpath and connect to OpenEJB via the RemoteInitialContextFactory like any other remote EJB client.
Maven setup
Running
Running the example is fairly simple, just run:
$ cd telephone-stateful
$ mvn clean install
Which should create output like the following.
[OPENEJB:INFO] Scanning for projects... [OPENEJB:INFO] ---------------------------------------------------------------------------- [OPENEJB:INFO] Building OpenEJB :: Examples :: Telephone Stateful Pojo [OPENEJB:INFO] task-segment: [OPENEJB:clean, install] [OPENEJB:INFO] ---------------------------------------------------------------------------- [OPENEJB:INFO] [clean:clean] [OPENEJB:INFO] Deleting directory /Users/dblevins/work/openejb3/examples/telephone-stateful/target [OPENEJB:INFO] Deleting directory /Users/dblevins/work/openejb3/examples/telephone-stateful/target/classes [OPENEJB:INFO] Deleting directory /Users/dblevins/work/openejb3/examples/telephone-stateful/target/test-classes [OPENEJB:INFO] [resources:resources] [OPENEJB:INFO] Using default encoding to copy filtered resources. [OPENEJB:INFO] [compiler:compile] Compiling 2 source files to /Users/dblevins/work/openejb3/examples/telephone-stateful/target/classes [OPENEJB:INFO] [resources:testResources] [OPENEJB:INFO] Using default encoding to copy filtered resources. [OPENEJB:INFO] [compiler:testCompile] Compiling 1 source file to /Users/dblevins/work/openejb3/examples/telephone-stateful/target/test-classes [OPENEJB:INFO] [surefire:test] [OPENEJB:INFO] Surefire report directory: /Users/dblevins/work/openejb3/examples/telephone-stateful/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.apache.openejb.examples.telephone.TelephoneTest log4j:WARN No appenders could be found for logger (OpenEJB). log4j:WARN Please initialize the log4j system properly. Apache OpenEJB 3.0-incubating-SNAPSHOT build: 20061228-01:59 http://incubator.apache.org/openejb 23:04:38,699 INFO [Startup] Found EjbModule in classpath: /Users/dblevins/work/openejb3/examples/telephone-stateful/target/classes 23:04:39,625 WARN [Startup] No ejb-jar.xml found assuming annotated beans present 23:04:39,658 WARN [OPENEJB:OpenEJB] Auto-deploying ejb TelephoneBean: EjbDeployment(deployment-id=TelephoneBean, container-id=Default Stateful Container) 23:04:39,659 WARN [OPENEJB:OpenEJB] Auto-creating a container for bean TelephoneBean: Container(type=STATEFUL, id=Default Stateful Container) 23:04:39,678 INFO [Startup] Loaded Module: /Users/dblevins/work/openejb3/examples/telephone-stateful/target/classes 23:04:40,140 INFO [Startup] OpenEJB ready. OpenEJB ready. ** Starting Services ** NAME IP PORT ejbd 0.0.0.0 4201 admin thread 0.0.0.0 4200 ------- Ready! Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.899 sec Results : Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 [OPENEJB:INFO] [jar:jar] [OPENEJB:INFO] Building jar: /Users/dblevins/work/openejb3/examples/telephone-stateful/target/telephone-stateful-1.0-SNAPSHOT.jar [OPENEJB:INFO] [install:install] [OPENEJB:INFO] Installing /Users/dblevins/work/openejb3/examples/telephone-stateful/target/telephone-stateful-1.0-SNAPSHOT.jar to ... [OPENEJB:INFO] ------------------------------------------------------------------------ [OPENEJB:INFO] BUILD SUCCESSFUL [OPENEJB:INFO] ------------------------------------------------------------------------ [OPENEJB:INFO] Total time: 11 seconds [OPENEJB:INFO] Finished at: Thu Dec 28 23:04:41 PST 2006 [OPENEJB:INFO] Final Memory: 19M/254M [OPENEJB:INFO] ------------------------------------------------------------------------