:index-group: Session Beans
:jbake-type: page
:jbake-status: status=published
= Simple Stateless

____
``Stateless session beans are session beans whose instances have no
conversational state. This means that all bean instances are equivalent
when they are not involved in servicing a client-invoked method. The
term `stateless' signifies that an instance has no state for a specific
client.''
____

What this means is quite simply that stateless beans are shared. They do
in fact have state as you can assign values to the variables, etc. in
the bean instance. The only catch is there are a pool of identical
instances and you are not guaranteed to get the exact same instance on
every call. For each call, you get whatever instance happens to be
available. This is identical to checking out a book from the library or
renting a movie from the video store. You are essentially checking out
or renting a new bean instance on each method call.

== CalculatorBean

[source,java]
----
package org.superbiz.stateless.basic;

import javax.ejb.Stateless;

@Stateless
public class CalculatorBean {

    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }

    public int multiply(int a, int b) {
        return a * b;
    }

    public int divide(int a, int b) {
        return a / b;
    }

    public int remainder(int a, int b) {
        return a % b;
    }
}
----

== CalculatorTest

Our `CalculatorBean` can be easily tested using the `EJBContainer` API
in EJB 3.1

[source,java]
----
package org.superbiz.stateless.basic;

import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import javax.ejb.embeddable.EJBContainer;
import javax.naming.NamingException;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

public class CalculatorTest {

    private static EJBContainer ejbContainer;

    private CalculatorBean calculator;

    @BeforeClass
    public static void startTheContainer() {
        ejbContainer = EJBContainer.createEJBContainer();
    }

    @Before
    public void lookupABean() throws NamingException {
        Object object = ejbContainer.getContext().lookup("java:global/simple-stateless/CalculatorBean");

        assertTrue(object instanceof CalculatorBean);

        calculator = (CalculatorBean) object;
    }

    @AfterClass
    public static void stopTheContainer() {
        if (ejbContainer != null) {
            ejbContainer.close();
        }
    }

    /**
     * Test Add method
     */
    @Test
    public void testAdd() {

        assertEquals(10, calculator.add(4, 6));

    }

    /**
     * Test Subtract method
     */
    @Test
    public void testSubtract() {

        assertEquals(-2, calculator.subtract(4, 6));

    }

    /**
     * Test Multiply method
     */
    @Test
    public void testMultiply() {

        assertEquals(24, calculator.multiply(4, 6));

    }

    /**
     * Test Divide method
     */
    @Test
    public void testDivide() {

        assertEquals(2, calculator.divide(12, 6));

    }

    /**
     * Test Remainder method
     */
    @Test
    public void testRemainder() {

        assertEquals(4, calculator.remainder(46, 6));

    }

}
----

== Running

Running the example should generate output similar to the following

[source,console]
----
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.superbiz.stateless.basic.CalculatorTest
Infos - ********************************************************************************
Infos - OpenEJB http://tomee.apache.org/
Infos - Startup: Tue Aug 14 13:28:12 CEST 2012
Infos - Copyright 1999-2012 (C) Apache OpenEJB Project, All Rights Reserved.
Infos - Version: 4.1.0
Infos - Build date: 20120814
Infos - Build time: 01:06
Infos - ********************************************************************************
Infos - openejb.home = /home/a185558/Development/Apache/openejb-trunk/examples/simple-stateless
Infos - openejb.base = /home/a185558/Development/Apache/openejb-trunk/examples/simple-stateless
Infos - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@33bb11
Infos - Succeeded in installing singleton service
Infos - Using 'javax.ejb.embeddable.EJBContainer=true'
Infos - Cannot find the configuration file [conf/openejb.xml].  Will attempt to create one for the beans deployed.
Infos - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
Infos - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
Infos - Creating TransactionManager(id=Default Transaction Manager)
Infos - Creating SecurityService(id=Default Security Service)
Infos - Beginning load: /home/a185558/Development/Apache/openejb-trunk/examples/simple-stateless/target/classes
Infos - Configuring enterprise application: /home/a185558/Development/Apache/openejb-trunk/examples/simple-stateless
Infos - Auto-deploying ejb CalculatorBean: EjbDeployment(deployment-id=CalculatorBean)
Infos - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container)
Infos - Auto-creating a container for bean CalculatorBean: Container(type=STATELESS, id=Default Stateless Container)
Infos - Creating Container(id=Default Stateless Container)
Infos - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
Infos - Auto-creating a container for bean org.superbiz.stateless.basic.CalculatorTest: Container(type=MANAGED, id=Default Managed Container)
Infos - Creating Container(id=Default Managed Container)
Infos - Using directory /tmp for stateful session passivation
Infos - Enterprise application "/home/a185558/Development/Apache/openejb-trunk/examples/simple-stateless" loaded.
Infos - Assembling app: /home/a185558/Development/Apache/openejb-trunk/examples/simple-stateless
Infos - Jndi(name="java:global/simple-stateless/CalculatorBean!org.superbiz.stateless.basic.CalculatorBean")
Infos - Jndi(name="java:global/simple-stateless/CalculatorBean")
Infos - Existing thread singleton service in SystemInstance() org.apache.openejb.cdi.ThreadSingletonServiceImpl@33bb11
Infos - OpenWebBeans Container is starting...
Infos - Adding OpenWebBeansPlugin : [CdiPlugin]
Infos - All injection points are validated successfully.
Infos - OpenWebBeans Container has started, it took 135 ms.
Infos - Created Ejb(deployment-id=CalculatorBean, ejb-name=CalculatorBean, container=Default Stateless Container)
Infos - Started Ejb(deployment-id=CalculatorBean, ejb-name=CalculatorBean, container=Default Stateless Container)
Infos - Deployed Application(path=/home/a185558/Development/Apache/openejb-trunk/examples/simple-stateless)
Infos - Undeploying app: /home/a185558/Development/Apache/openejb-trunk/examples/simple-stateless
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.068 sec

Results :

Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
----
