Stateless is not Stateless ??
feristhia May 10, 2006 10:53 AMHi All,
Just curious with JBoss Stateless Session Bean. I currently have jboss-4.0.3SP1 running as my application server. Then I try to deploy a simple stateless session bean.
I have 2 interfaces (home and remote) and the bean class as follows
//PlayerHome.java package jndi.bean; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; public interface PlayerHome extends EJBHome { public Player create() throws RemoteException, CreateException; }
//Player.java package jndi.bean; import java.rmi.RemoteException; import javax.ejb.EJBObject; public interface Player extends EJBObject { public String getPlayerID() throws RemoteException; public void setPlayerID(String playerid) throws RemoteException; }
//PlayerBean.java package jndi.bean; import java.rmi.RemoteException; import java.util.*; import javax.ejb.EJBException; import javax.ejb.SessionBean; import javax.ejb.SessionContext; public class PlayerBean implements SessionBean { private String playerID; private String position; private String playerName; private int salary; Collection objCollection; public String getPlayerID() { return playerID; } public void setPlayerID(String playeridvalue) { playerID = playeridvalue; } public String getPlayerName() { return playerName; } public void setPlayerName(String playerName) { this.playerName = playerName; } public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } public void setSessionContext(SessionContext arg0) throws EJBException, RemoteException { // TODO Auto-generated method stub } public void ejbCreate() { } public void ejbRemove(){ // TODO Auto-generated method stub } public void ejbActivate() throws EJBException, RemoteException { // TODO Auto-generated method stub } public void ejbPassivate() throws EJBException, RemoteException { // TODO Auto-generated method stub } }
and the deployment descriptor
<?xml version="1.0" encoding="UTF-8"?> <ejb-jar id="ejb-jar_ID" version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"> <description>jBoss test application</description> <display-name>Player Test</display-name> <enterprise-beans> <session> <ejb-name>PlayerBean</ejb-name> <home>jndi.bean.PlayerHome</home> <remote>jndi.bean.Player</remote> <ejb-class>jndi.bean.PlayerBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Bean</transaction-type> </session> </enterprise-beans> </ejb-jar>
and all the code deployed successfully.... I try to access that from the client
//PlayerTest.java import java.util.*; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import jndi.bean.*; public class PlayerTest { public static void main(String[] args) { try { Properties prop = new Properties(); prop.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); prop.setProperty("java.naming.provider.url", "192.168.100.34:1099"); InitialContext ctx = new InitialContext(prop); Object ref = ctx.lookup("PlayerBean"); PlayerHome myHome = (PlayerHome) PortableRemoteObject.narrow(ref,PlayerHome.class); Player myplayer = (Player) myHome.create(); myplayer.setPlayerID("J-001"); System.out.println(myplayer.getPlayerID()); } catch(Exception e) { e.printStackTrace(); } } }
it will print :
J-001
as the result.
Then.... I try to call it without set any value ... so I remove the following code from PlayerTest.java
myplayer.setPlayerID("J-001");
What I expected is a null value. But it comes out "J-001" as the result. Then I try to access from another client.... still got "J-001".
How is it happen ? Is there something wrong about my code ? Why JBoss cache the Stateless while it should be removed after a client instance is remove ?
Regards,
Feris