Problem appreciating the stateless bean behavior
oceanvijai Oct 16, 2013 2:51 AMHi,
I am a newbie to EJB and started off with EJB 3.0. It annotations are cool but when I was trying to study EJB stateless session bean behavior by trying some samples, I got stuck up. The details are as follows,
I created a stateless session bean as follows,
stateless remote interface.
package sample.testing.EJBs.sessionBean.stateless;
import javax.ejb.Remote;
@Remote
public interface FirstStatelessSessionBeanRemote
{
public String getMyName();
public void appendName( String nameToAppend);
}
stateless bean impl
package sample.testing.EJBs.sessionBean.stateless;
import javax.ejb.Remote;
import javax.ejb.Stateless;
/**
* Session Bean implementation class FirstStatelessSessionBean
*/
@Stateless (name="vijai'sFirstStatelessSessionBean")
public class FirstStatelessSessionBean implements FirstStatelessSessionBeanRemote {
/**
* Default constructor.
*
*/
public FirstStatelessSessionBean() {
name = "vijai";
}
private String name="";
@Override
public String getMyName() {
// TODO Auto-generated method stub
return getName();
}
@Override
public void appendName(String nameToAppend) {
name += nameToAppend;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
So I deployed this as a jar is the same Jboss 7.1 server. For testing I created a simple servlet application and tested as follows,
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
response.getWriter().println(context.getEnvironment());
String app_name="";
String module_name="/sampleEJBProject";
String distinct_name="/";
String bean_name="/vijai'sFirstStatelessSessionBean";
String remoteInterface_name="sample.testing.EJBs.sessionBean.stateless.FirstStatelessSessionBeanRemote";
String ejbBeanJNDIName = "ejb:"+app_name+module_name+distinct_name+bean_name+"!"+remoteInterface_name;
response.getWriter().println(ejbBeanJNDIName);
Object obj = context.lookup(ejbBeanJNDIName);
response.getWriter().println(obj);
FirstStatelessSessionBeanRemote bean = (FirstStatelessSessionBeanRemote)obj;
bean.appendName("Vijai");
response.getWriter().println(bean.getMyName());
bean.appendName("anand");
response.getWriter().println(bean.getMyName());
} catch (Exception e) {
e.printStackTrace();
response.getWriter().println(e.getMessage());
}
The result was something like this,
1st refresh: vijaVijaianand
2nd refresh: vijaVijaianandVijaianand
3rd refresh: vijaVijaianandVijaianandVijaianand
and so.... but as per the definition of a stateless bean, the scope is expected to be destroyed after the invocation method is complete right ?
so I should be getting something like
1st refresh: vijaVijaianand
2nd refresh: vijaVijaianand
3rd refresh: vijaVijaianand
But I dont, can anyone advice me when am I doing wrong here please....