|
|But I agree that the code sould be modified to either:
| - really pool SLSB (and only SLSB)
| - or correctly call ejbRemove on the SLSB
|
|Any opinion?
ask for a fix :)
marcf
|
|Cheers,
|
|
|
| Sacha
|
|P.S.: I forward this to JBoss-dev.
|
|> -----Message d'origine-----
|> De : [EMAIL PROTECTED]
|> [mailto:[EMAIL PROTECTED]]De la part de Oliver
|> Henlich
|> Envoy� : mercredi, 19 septembre 2001 15:18
|> � : [EMAIL PROTECTED]
|> Objet : [JBoss-user] How does JBoss do Stateless Session Beans?
|>
|>
|> Hi guys.
|> I'm very confused about how JBoss handles stateless session beans.
|> I've investigated the spec, jboss doc, DEBUG level jboss trace, forums
|> and mailing list.
|> I've tried to structure my problem into:
|> - what i believe i should be seeing/getting
|> - what i'm doing
|> - what i'm getting
|> - questions
|> - code
|>
|> I would very much appreciate any clear insight into this...anyone
|> from the dev team out there who knows for sure?
|>
|> cheers
|> oliver
|> NOTE: Web site is down...will try to post it on forums when it is up
|> again.
|>
|> Stateless session beans (as i understand them)
|> =======================
|> o these are created by the container by executing the following:
|> - Class.newInstance()
|> - setSessionContext()
|> - ejbCreate()
|> after which they enter the 'Method-Ready Pool' and start servicing
|> client requests.
|>
|> o The ejbCreate() method is invoked only once in the lifecycle of the
|> stateless session bean. Also when the client invokes create() on the
|> EJB Home, it is not delegated to the bean instance.
|>
|> o When a client calls a method on the remote interface, the bean
|> instance is associated with a EJBObject for the duration of the
|> method after which it is disassociated from the EJBObject and
|> returned to the 'Method-Ready Pool' (Instance swapping)
|>
|> o A stateless session bean instance should be able to service
|> multiple clients in its lifetime. However i guess it is up
|> to the containers strategy...ie whether he pools instances
|> or creates a new one every time one is needed.
|>
|> Actions
|> =======
|> I have a very simple stateless session bean that has one method
|> a client can invoke called execute().
|>
|> A simple test client does the lookup, cast to home, home.create
|> and remote.execute() - for which i have included the trace
|>
|> The next test is the same except that the execute() method is
|> invoked twice on the same remote interface.
|>
|> please see the JBoss trace.
|>
|> Questions
|> =========
|> Q1 - Immediately after the bean has serviced the execute() method
|> the container calls setSessionContext() and ejbCreate(). Why?
|>
|> Q2 - Why is ejbRemove() never called? Is it because all the beans
|> created by ejbCreate() are still in the 'method-ready pool'
|> and the server has not decided to remove them yet?
|> If so, then why are these pooled instances not used to service
|> the client request?
|>
|> Q3 - If the container creates a new instance of the stateless session
|> bean everytime one is needed, then surely we should see the
|> ejbRemove()s
|> corresponding to the ejbCreate()s.
|>
|> Q4 - So what does jboss do with stateless session beans?
|>
|> JBoss Trace
|> ===========
|> <-- Start of Deployment -->
|> [AutoDeployer] Auto deploy of
|> file:/D:/JBoss-2.4.1/deploy/SimpleStateless.jar
|> [J2EE Deployer Default] Deploy J2EE application:
|> file:/D:/JBoss-2.4.1/deploy/SimpleStateless.jar
|> [J2eeDeployer] Create application SimpleStateless.jar
|> [J2eeDeployer] install EJB module SimpleStateless.jar
|> [Container factory]
|> Deploying:file:/D:/JBoss-2.4.1/tmp/deploy/Default/SimpleStateless.jar/
|> [Verifier] Verifying
|> file:/D:/JBoss-2.4.1/tmp/deploy/Default/SimpleStateless.jar/ejb1010.jar
|> [Verifier] SimpleStatelessBean: Verified.
|> [Container factory] Deploying SimpleStatelessBean
|> [Container factory] Container Invoker RMI Port='4444'
|> [Container factory] Container Invoker Client SocketFactory='Default'
|> [Container factory] Container Invoker Server SocketFactory='Default'
|> [Container factory] Container Invoker Server SocketAddr='Default'
|> [Container factory] Container Invoker Optimize='true'
|> [Container factory] Begin java:comp/env for EJB: SimpleStatelessBean
|> [Container factory] TCL: java.net.URLClassLoader@4af083
|> [Container factory] End java:comp/env for EJB: SimpleStatelessBean
|> [Container factory] Mapped Container method remove HASH -1842617161
|> [Container factory] Mapped Container method getEJBHome HASH -993218923
|> [Container factory] Mapped Container method getHandle HASH 1182305581
|> [Container factory] Mapped Container method getPrimaryKey HASH
|> -131865408
|> [Container factory] Mapped Container method isIdentical HASH 285457048
|> [Container factory] Mapped execute 1868813453to public void
|> SimpleStatelessEJB.execute(int)
|> [Container factory] Mapping remove
|> [Container factory] Mapping remove
|> [Container factory] Mapping getEJBMetaData
|> [Container factory] Mapping getHomeHandle
|> [Container factory] Mapping create
|> [Container factory] JRMP 1.3 CI initialized
|> [Container factory] Bound SimpleStatelessBean to SimpleStatelessBean
|> [ContainerManagement] Initializing
|> [ContainerManagement] Initialized
|> [ContainerManagement] Starting
|> [ContainerManagement] Started
|> [Container factory] Deployed application:
|> file:/D:/JBoss-2.4.1/tmp/deploy/Default/SimpleStateless.jar/
|> [J2EE Deployer Default] J2EE application:
|> file:/D:/JBoss-2.4.1/deploy/SimpleStateless.jar is deployed.
|> <-- End of Deployment -->
|>
|> <-- Start of test client run (SINGLE call to remote interface method
|> execute()) -->
|> [Default] SimpleStatelessEJB:setSessionContext
|> [Default] SimpleStatelessEJB:ejbCreate - EJBObject associated with this
|> instance:
|> [Default] id=5691336
|> [Default]
|> [Default] SimpleStatelessEJB:execute - param=1, test=1000893772805
|> [Default] SimpleStatelessEJB:setSessionContext
|> [Default] SimpleStatelessEJB:ejbCreate - EJBObject associated with this
|> instance:
|> [Default] id=5691336
|> [Default]
|> <-- End of test client run -->
|>
|> <-- Start of test client run (TWO calls to remote interface method
|> execute()) -->
|> [Default] SimpleStatelessEJB:execute - param=1, test=1000893772865
|> [Default] SimpleStatelessEJB:setSessionContext
|> [Default] SimpleStatelessEJB:ejbCreate - EJBObject associated with this
|> instance:
|> [Default] id=5691336
|> [Default]
|> [Default] SimpleStatelessEJB:execute - param=2, test=1000894153943
|> [Default] SimpleStatelessEJB:setSessionContext
|> [Default] SimpleStatelessEJB:ejbCreate - EJBObject associated with this
|> instance:
|> [Default] id=5691336
|> [Default]
|> <-- End of test client run -->
|>
|> CODE
|> ====
|> <-REMOTE------------------------------------------------------------->
|> import javax.ejb.EJBObject;
|> import java.rmi.RemoteException;
|>
|> public interface SimpleStateless extends EJBObject
|> {
|> public void execute(int aParam) throws RemoteException;
|> }
|> <-HOME--------------------------------------------------------------->
|> import javax.ejb.EJBHome;
|> import javax.ejb.CreateException;
|> import java.rmi.RemoteException;
|>
|> public interface SimpleStatelessHome extends EJBHome
|> {
|> public SimpleStateless create() throws CreateException,
|> RemoteException;
|> }
|> <-BEAN--------------------------------------------------------------->
|> import javax.ejb.EJBObject;
|> import javax.ejb.SessionBean;
|> import javax.ejb.SessionContext;
|> import javax.ejb.EJBException;
|> import java.rmi.RemoteException;
|>
|> public class SimpleStatelessEJB implements SessionBean
|> {
|>
|> //======================================================================
|> =====
|> // Start SimpleStateless implementation
|>
|> //======================================================================
|> =====
|> public void execute(int aParam)
|> {
|> System.out.println(CNAME + ":execute - param="+aParam + ",
|> test="+test);
|> }
|>
|> //======================================================================
|> =====
|> // End SimpleStateless implementation
|>
|> //======================================================================
|> =====
|>
|>
|> //======================================================================
|> =====
|> // Start SimpleStatelessHome implementation
|>
|> //======================================================================
|> =====
|> public void ejbCreate()
|> {
|> // init a member variable which will prove to us a new stateless
|> session
|> // bean has been moved a 'does not exist' to 'method-ready pool'
|> state
|> test = ""+System.currentTimeMillis();
|>
|> // have a look at who is servicing us
|> try
|> {
|> EJBObject obj = ejbContext.getEJBObject();
|> System.out.print(CNAME + ":ejbCreate - EJBObject associated with
|> this instance:");
|> System.out.print(" id="+obj.hashCode());
|>
|> if (lastEJBObject != null);
|> {
|> //System.out.print(" isIdentical to
|> last="+lastEJBObject.isIdentical(obj));
|> }
|>
|> System.out.println();
|> lastEJBObject = obj;
|> }
|> catch (Exception e)
|> {
|> System.out.println(CNAME+":"+e);
|> throw new EJBException(e);
|> }
|> }
|>
|> //======================================================================
|> =====
|> // End SimpleStatelessHome implementation
|>
|> //======================================================================
|> =====
|>
|>
|> //======================================================================
|> =====
|> // Start EJB callback methods
|>
|> //======================================================================
|> =====
|>
|> public void ejbActivate() {} // not used
|> public void ejbPassivate() {} // not used
|>
|> public void ejbRemove()
|> {
|> System.out.println(CNAME + ":ejbRemove");
|> }
|>
|> public void setSessionContext(SessionContext aContext)
|> {
|> System.out.println(CNAME + ":setSessionContext");
|> ejbContext = aContext;
|> }
|>
|> public SessionContext getEJBContext()
|> {
|> System.out.println(CNAME + ":getSessionContext");
|> return (ejbContext);
|> }
|>
|> //======================================================================
|> =====
|> // End EJB callback methods
|>
|> //======================================================================
|> =====
|>
|>
|> //======================================================================
|> =====
|> // Member variables
|>
|> //======================================================================
|> =====
|> private SessionContext ejbContext;
|> private EJBObject lastEJBObject;
|> private String test;
|>
|>
|> //======================================================================
|> =====
|> // Constants
|>
|> //======================================================================
|> =====
|> private final String CNAME = this.getClass().getName();
|> }
|> <-CLIENT------------------------------------------------------------->
|> import java.util.Properties;
|> import javax.rmi.PortableRemoteObject;
|> import javax.naming.*;
|>
|> class TestClient
|> {
|> public static void main(String[] args)
|> {
|> Properties env = new Properties();
|> env.setProperty("java.naming.factory.initial",
|> "org.jnp.interfaces.NamingContextFactory");
|> env.setProperty("java.naming.provider.url", "localhost:1099");
|> env.setProperty("java.naming.factory.url.pkgs",
|> "org.jboss.naming");
|>
|> try
|> {
|> // Get a naming context
|> InitialContext jndiContext = new InitialContext(env);
|> System.out.println("Got context");
|>
|> // Get a reference to the Bean
|> Object ref = jndiContext.lookup("SimpleStatelessBean");
|> System.out.println("Got reference");
|>
|> // Get a reference from this to the Bean's Home interface
|> SimpleStatelessHome home = (SimpleStatelessHome)
|> PortableRemoteObject.narrow (ref, SimpleStatelessHome.class);
|>
|> // Create remote object from the Home interface
|> SimpleStateless s = home.create();
|>
|> // call remote method
|> s.execute(1);
|> System.out.println("called execute 1");
|> s.execute(2);
|> System.out.println("called execute 2");
|> }
|> catch(Exception e)
|> {
|> e.printStackTrace();
|> }
|> }
|> }
|> <-DEPLOY DESCRIPTOR-------------------------------------------------->
|> <?xml version="1.0"?>
|> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise
|> JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
|>
|> <ejb-jar>
|> <display-name>SimpleStatelessSessionBean</display-name>
|> <enterprise-beans>
|> <session>
|> <ejb-name>SimpleStatelessBean</ejb-name>
|> <home>SimpleStatelessHome</home>
|> <remote>SimpleStateless</remote>
|> <ejb-class>SimpleStatelessEJB</ejb-class>
|> <session-type>Stateless</session-type>
|> <transaction-type>Container</transaction-type>
|> </session>
|> </enterprise-beans>
|>
|> <assembly-descriptor>
|> <container-transaction>
|> <method>
|> <ejb-name>SimpleStatelessBean</ejb-name>
|> <method-name>*</method-name>
|> </method>
|> <trans-attribute>Required</trans-attribute>
|> </container-transaction>
|> </assembly-descriptor>
|>
|> </ejb-jar>
|>
|> MISC
|> ====
|> Java version: 1.3.1,Sun Microsystems Inc.
|> Java VM: Java HotSpot(TM) Server VM 1.3.1-b24,Sun Microsystems Inc.
|> System: Windows NT 4.0,x86
|> JBoss: 2.4.1
|>
|>
|> _______________________________________________
|> JBoss-user mailing list
|> [EMAIL PROTECTED]
|> https://lists.sourceforge.net/lists/listinfo/jboss-user
|>
|
|
|_______________________________________________
|Jboss-development mailing list
|[EMAIL PROTECTED]
|https://lists.sourceforge.net/lists/listinfo/jboss-development
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development