= Simple Stateless
:jbake-date: 2016-09-06
:jbake-type: page
:jbake-tomeepdf:
:jbake-status: published

Example simple-stateless can be browsed at https://github.com/apache/tomee/tree/master/examples/simple-stateless



NOTE: "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]
----
-------------------------------------------------------
 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
----

    
