Stateful Session Bean Lifecycle: PrePassivate
File: Employee.java
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PostRemove;
@Entity
public class Employee implements java.io.Serializable {
private int id;
private String firstName;
private String lastName;
@Id
@GeneratedValue
public int getId() {
return id;
}
@PostRemove
public void postRemove()
{
System.out.println(“@PostRemove”);
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String first) {
this.firstName = first;
}
public String getLastName() {
return lastName;
}
public void setLastName(String last) {
this.lastName = last;
}
}
File: EmployeeBean.java
import javax.ejb.PrePassivate;
import javax.ejb.Stateful;
@Stateful
public class EmployeeBean implements EmployeeServiceLocal, EmployeeServiceRemote {
public EmployeeBean() {
}
public void doAction(){
System.out.println(“doAction”);
}
@PrePassivate
public void PrePassivate() {
System.out.println(“PrePassivate”);
}
}
File: EmployeeServiceLocal.java
import java.util.Map;
import javax.ejb.Local;
@Local
public interface EmployeeServiceLocal {
public void doAction();
}
File: EmployeeServiceRemote.java
import javax.ejb.Remote;
@Remote
public interface EmployeeServiceRemote {
public void doAction();
}
File: jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
File: Main.java
import javax.ejb.EJB;
import javax.naming.InitialContext;
public class Main {
public static void main(String[] a) throws Exception {
EmployeeServiceRemote service = null;
// Context compEnv = (Context) new InitialContext().lookup(“java:comp/env”);
// service = (HelloService)new InitialContext().lookup(“java:comp/env/ejb/HelloService”);
service = (EmployeeServiceRemote) new InitialContext().lookup(“EmployeeBean/remote”);
service.doAction();
}
}
EJB Tutorial from JBoss: Stateful Session Bean
File: ShoppingCart.java
/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.tutorial.stateful.bean;
import java.util.HashMap;
import javax.ejb.Remove;
public interface ShoppingCart
{
void buy(String product, int quantity);
HashMap<String, Integer> getCartContents();
@Remove void checkout();
}
File: ShoppingCartBean.java
/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.tutorial.stateful.bean;
import java.io.Serializable;
import java.util.HashMap;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.ejb.Remote;
@Stateful
@Remote(ShoppingCart.class)
public class ShoppingCartBean implements ShoppingCart, Serializable
{
private HashMap<String, Integer> cart = new HashMap<String, Integer>();
public void buy(String product, int quantity)
{
if (cart.containsKey(product))
{
int currq = cart.get(product);
currq += quantity;
cart.put(product, currq);
}
else
{
cart.put(product, quantity);
}
}
public HashMap<String, Integer> getCartContents()
{
return cart;
}
@Remove
public void checkout()
{
System.out.println(“To be implemented”);
}
}
File: Client.java
/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.tutorial.stateful.client;
import java.util.HashMap;
import javax.naming.InitialContext;
import org.jboss.tutorial.stateful.bean.ShoppingCart;
/**
* Comment
*
* @author <a href=”mailto:bill@jboss.org”>Bill Burke</a>
* @version $Revision: 57207 $
*/
public class Client
{
public static void main(String[] args) throws Exception
{
InitialContext ctx = new InitialContext();
ShoppingCart cart = (ShoppingCart) ctx.lookup(“ShoppingCartBean/remote”);
System.out.println(“Buying 1 memory stick”);
cart.buy(“Memory stick”, 1);
System.out.println(“Buying another memory stick”);
cart.buy(“Memory stick”, 1);
System.out.println(“Buying a laptop”);
cart.buy(“Laptop”, 1);
System.out.println(“Print cart:”);
HashMap<String, Integer> fullCart = cart.getCartContents();
for (String product : fullCart.keySet())
{
System.out.println(fullCart.get(product) + “ ” + product);
}
System.out.println(“Checkout”);
cart.checkout();
System.out.println(“Should throw an object not found exception by invoking on cart after @Remove method”);
try
{
cart.getCartContents();
}
catch (javax.ejb.EJBNoSuchObjectException e)
{
System.out.println(“Successfully caught no such object exception.”);
}
}
}
Datagrams Vs Sessions
- Connection-oriented protocols also known as session-based protocols, virtual circuits or sequenced packet exchanges – provide a reliable two-way connection service over a session.
- Each packet of information gets exchanged over a session.
- Duplicate packets are detected and discarded by the session services.
- Overhead associated with creating and managing the session. If a session is lost, one of the parties must reestablish it.
- This can be a problem for fault-tolerant servers that require automatic switch overs to a backup server if the primary server fails.
- The backup server needs to reestablish all the outstanding sessions with clients.
- Datagrams also known as connectionless protocols or transmits and pray protocols provide a simple but unreliable form of exchange.
- The more powerful datagram protocols such as NetBIOS provide broadcast capabilities.
- NetBIOS allows you to send datagrams to a named entity, to a select group of entities (multicast), or to all entities on a network (broadcast).
- Datagrams are unreliable in the sense that they are not acknowledged or tracked through a sequence number.
- Some stacks (ex: LAN Server’s MailSlots) provide an acknowledged datagram service.
- Datagrams are very useful to have in “discovery” types of situations. These are situations where you discover things about your network environment by broadcasting queries and learning who is out there from the response.
- Broadcast can be used to obtain bids for services or to advertise the avilability of new services.
- Broadcast datagrams provide the capability of creating electronic “bazaars”
- The alternative to broadcast is to use a network directory service.
- Datagrams are also very useful in situations where there is a need to send a quick message (or) important message.
- Ex: All the systems have to send the “I am alive” message periodically to the network manager.
- The ordinary method may need 500 sessions for each computer in the network and not possible.
- Instead the system can broadcast the datagram to the manager.