Introduction to EJB, Stateless and Stateful Beans, and Message-Driven Beans


Enterprise JavaBeans (EJB) is a server-side software component architecture that simplifies the development of enterprise-level distributed applications. This article provides an introduction to EJB and explains the differences between stateless, stateful, and message-driven beans.

Step 1: What is EJB?

EJB is a part of the Java EE framework and is used to build scalable, transactional, and secure server-side applications. It simplifies development by providing built-in support for services like transactions, security, and concurrency.

EJB is divided into three main types:

  • Stateless Session Beans: Do not maintain a conversational state.
  • Stateful Session Beans: Maintain a conversational state with the client.
  • Message-Driven Beans (MDBs): Handle asynchronous messaging using the Java Message Service (JMS).

Step 2: Setting Up EJB

Before working with EJB, ensure that you have a Java EE server like WildFly or GlassFish. Create a Java EE project in your preferred IDE and configure it to support EJB.

Step 3: Stateless Session Beans

Stateless session beans are used for tasks that do not require maintaining state between method calls. They are lightweight and can handle multiple client requests.

Example:

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;
     }
 }
        

To access this bean, use the EJB client:

import javax.naming.InitialContext;

public class ClientApp {
    public static void main(String[] args) throws Exception {
        InitialContext ctx = new InitialContext();
        CalculatorBean calculator = (CalculatorBean) ctx.lookup("java:global/YourAppName/CalculatorBean");
        System.out.println("Addition: " + calculator.add(5, 3));
    }
}
        

Step 4: Stateful Session Beans

Stateful session beans maintain a conversational state with the client. This is useful for scenarios like shopping carts or user sessions.

Example:

import javax.ejb.Stateful;

@Stateful
public class ShoppingCartBean {
    private List items = new ArrayList<>();

    public void addItem(String item) {
        items.add(item);
    }

    public List getItems() {
         return items;
    }
 }
        

Client to interact with the stateful bean:

import javax.naming.InitialContext;

public class ShoppingCartClient {
    public static void main(String[] args) throws Exception {
        InitialContext ctx = new InitialContext();
        ShoppingCartBean cart = (ShoppingCartBean) ctx.lookup("java:global/YourAppName/ShoppingCartBean");

        cart.addItem("Laptop");
        cart.addItem("Mouse");

        System.out.println("Cart Items: " + cart.getItems());
    }
}
        

Step 5: Message-Driven Beans (MDBs)

Message-Driven Beans are used to handle asynchronous messages sent via JMS. They are not directly invoked by the client but listen to a specific JMS queue or topic.

Example:

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/TestQueue")
})
public class MessageBean implements MessageListener {
    public void onMessage(Message message) {
        try {
            String msgText = message.getBody(String.class);
             System.out.println("Received Message: " + msgText);
        } catch (Exception e) {
             e.printStackTrace();
        }
    }
 }
        

To send a message to the queue:

import javax.jms.*;
import javax.naming.InitialContext;

public class JMSClient {
     public static void main(String[] args) throws Exception {
         InitialContext ctx = new InitialContext();
         ConnectionFactory factory = (ConnectionFactory) ctx.lookup("java:/ConnectionFactory");
         Queue queue = (Queue) ctx.lookup("java:/jms/queue/TestQueue");

        Connection connection = factory.createConnection();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer producer = session.createProducer(queue);

        TextMessage message = session.createTextMessage("Hello, EJB!");
        producer.send(message);

        System.out.println("Message sent.");
        session.close();
        connection.close();
    }
}
        

Conclusion

EJB simplifies enterprise application development by providing built-in support for transactions, security, and scalability. Stateless beans are ideal for lightweight operations, stateful beans manage client-specific state, and message-driven beans handle asynchronous processing. By using these components, developers can create robust, distributed applications.





Advertisement