Overview
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.
[INFO] Scanning for projects... [INFO] ---------------------------------------------------------------------------- [INFO] Building OpenEJB :: Examples :: Telephone Stateful Pojo [INFO] task-segment: [clean, install] [INFO] ---------------------------------------------------------------------------- [INFO] [clean:clean] [INFO] Deleting directory /Users/dblevins/work/openejb3/examples/telephone-stateful/target [INFO] Deleting directory /Users/dblevins/work/openejb3/examples/telephone-stateful/target/classes [INFO] Deleting directory /Users/dblevins/work/openejb3/examples/telephone-stateful/target/test-classes [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] Compiling 2 source files to /Users/dblevins/work/openejb3/examples/telephone-stateful/target/classes [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] Compiling 1 source file to /Users/dblevins/work/openejb3/examples/telephone-stateful/target/test-classes [INFO] [surefire:test] [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: module: /Users/dblevins/work/openejb3/examples/telephone-stateful/target/classes 23:04:39,658 WARN [OpenEJB] Auto-deploying ejb TelephoneBean: EjbDeployment(deployment-id=TelephoneBean, container-id=Default Stateful Container) 23:04:39,659 WARN [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 [INFO] [jar:jar] [INFO] Building jar: /Users/dblevins/work/openejb3/examples/telephone-stateful/target/telephone-stateful-1.0-SNAPSHOT.jar [INFO] [install:install] [INFO] Installing /Users/dblevins/work/openejb3/examples/telephone-stateful/target/telephone-stateful-1.0-SNAPSHOT.jar to /Users/dblevins/.m2/repository/org/apache/openejb/telephone-stateful/1.0-SNAPSHOT/telephone-stateful-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 11 seconds [INFO] Finished at: Thu Dec 28 23:04:41 PST 2006 [INFO] Final Memory: 19M/254M [INFO] ------------------------------------------------------------------------