| :index-group: Session Beans |
| :jbake-type: page |
| :jbake-status: status=published |
| = Simple Stateful |
| |
| This example demonstrates a simple deployment of a Stateful session |
| bean. |
| |
| ____ |
| ``As its name suggests, a stateful session bean is similar to an |
| interactive session. A stateful session bean is not shared; it can have |
| only one client, in the same way that an interactive session can have |
| only one user. When the client terminates, its stateful session bean |
| appears to terminate and is no longer associated with the client.'' |
| ____ |
| |
| The `Counter` class is a Stateful session bean that maintains a state in |
| a form of a `count` integer field. It exposes three methods: `count()`, |
| `increment()` and `reset()` to manipulate and view its state. |
| |
| Typically, Stateful and Stateless beans implement Local and/or Remote |
| interfaces to determine which methods should be exposed. In this case, |
| the bean is using a no-interface view, which means that all public |
| methods are exposed as a local view. |
| |
| == Counter |
| |
| [source,java] |
| ---- |
| package org.superbiz.counter; |
| |
| import javax.ejb.Stateful; |
| |
| /** |
| * This is an EJB 3 style pojo stateful session bean |
| * Every stateful session bean implementation must be annotated |
| * using the annotation @Stateful |
| * This EJB has 2 business interfaces: CounterRemote, a remote business |
| * interface, and CounterLocal, a local business interface |
| * <p/> |
| * Per EJB3 rules when the @Remote or @Local annotation isn't present |
| * in the bean class (this class), all interfaces are considered |
| * local unless explicitly annotated otherwise. If you look |
| * in the CounterRemote interface, you'll notice it uses the @Remote |
| * annotation while the CounterLocal interface is not annotated relying |
| * on the EJB3 default rules to make it a local interface. |
| */ |
| //START SNIPPET: code |
| @Stateful |
| public class Counter { |
| |
| private int count = 0; |
| |
| public int count() { |
| return count; |
| } |
| |
| public int increment() { |
| return ++count; |
| } |
| |
| public int reset() { |
| return (count = 0); |
| } |
| } |
| ---- |
| |
| == CounterTest |
| |
| The `Counter` class is tested by obtaining a `Context` object and |
| performing a JNDI lookup on it, to retrieve an instance of the `Counter` |
| bean. After some state manipulation, a new instance is fetched from the |
| container and we can see that it’s a new instance. |
| |
| [source,java] |
| ---- |
| package org.superbiz.counter; |
| |
| import junit.framework.TestCase; |
| |
| import javax.ejb.embeddable.EJBContainer; |
| import javax.naming.Context; |
| |
| public class CounterTest extends TestCase { |
| |
| //START SNIPPET: local |
| public void test() throws Exception { |
| |
| final Context context = EJBContainer.createEJBContainer().getContext(); |
| |
| Counter counterA = (Counter) context.lookup("java:global/simple-stateful/Counter"); |
| |
| assertEquals(0, counterA.count()); |
| assertEquals(0, counterA.reset()); |
| assertEquals(1, counterA.increment()); |
| assertEquals(2, counterA.increment()); |
| assertEquals(0, counterA.reset()); |
| |
| counterA.increment(); |
| counterA.increment(); |
| counterA.increment(); |
| counterA.increment(); |
| |
| assertEquals(4, counterA.count()); |
| |
| // Get a new counter |
| Counter counterB = (Counter) context.lookup("java:global/simple-stateful/Counter"); |
| |
| // The new bean instance starts out at 0 |
| assertEquals(0, counterB.count()); |
| } |
| //END SNIPPET: local |
| } |
| ---- |
| |
| == Running |
| |
| [source,console] |
| ---- |
| ------------------------------------------------------- |
| T E S T S |
| ------------------------------------------------------- |
| Running org.superbiz.counter.CounterTest |
| Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06 |
| http://tomee.apache.org/ |
| INFO - openejb.home = /Users/dblevins/examples/simple-stateful |
| INFO - openejb.base = /Users/dblevins/examples/simple-stateful |
| INFO - Using 'javax.ejb.embeddable.EJBContainer=true' |
| INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) |
| INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) |
| INFO - Found EjbModule in classpath: /Users/dblevins/examples/simple-stateful/target/classes |
| INFO - Beginning load: /Users/dblevins/examples/simple-stateful/target/classes |
| INFO - Configuring enterprise application: /Users/dblevins/examples/simple-stateful |
| INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container) |
| INFO - Auto-creating a container for bean Counter: Container(type=STATEFUL, id=Default Stateful Container) |
| INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) |
| INFO - Auto-creating a container for bean org.superbiz.counter.CounterTest: Container(type=MANAGED, id=Default Managed Container) |
| INFO - Enterprise application "/Users/dblevins/examples/simple-stateful" loaded. |
| INFO - Assembling app: /Users/dblevins/examples/simple-stateful |
| INFO - Jndi(name="java:global/simple-stateful/Counter!org.superbiz.counter.Counter") |
| INFO - Jndi(name="java:global/simple-stateful/Counter") |
| INFO - Jndi(name="java:global/EjbModule309142400/org.superbiz.counter.CounterTest!org.superbiz.counter.CounterTest") |
| INFO - Jndi(name="java:global/EjbModule309142400/org.superbiz.counter.CounterTest") |
| INFO - Created Ejb(deployment-id=Counter, ejb-name=Counter, container=Default Stateful Container) |
| INFO - Created Ejb(deployment-id=org.superbiz.counter.CounterTest, ejb-name=org.superbiz.counter.CounterTest, container=Default Managed Container) |
| INFO - Started Ejb(deployment-id=Counter, ejb-name=Counter, container=Default Stateful Container) |
| INFO - Started Ejb(deployment-id=org.superbiz.counter.CounterTest, ejb-name=org.superbiz.counter.CounterTest, container=Default Managed Container) |
| INFO - Deployed Application(path=/Users/dblevins/examples/simple-stateful) |
| Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.098 sec |
| |
| Results : |
| |
| Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 |
| ---- |