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.
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:
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.
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)); } }
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 Listitems = 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()); } }
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(); } }
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.