KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jfox > ejb > StatelessBucket


1 /* JFox, the OpenSource J2EE Application Server
2  *
3  * Distributable under GNU LGPL license by gun.org
4  * more details please visit http://www.huihoo.org/jfox
5  */

6
7 package org.jfox.ejb;
8
9 import java.rmi.RemoteException JavaDoc;
10 import javax.ejb.EnterpriseBean JavaDoc;
11 import javax.ejb.Handle JavaDoc;
12 import javax.ejb.RemoveException JavaDoc;
13 import javax.ejb.SessionBean JavaDoc;
14 import javax.ejb.SessionContext JavaDoc;
15
16 import org.jfox.ejb.connector.EJBInvocation;
17 import org.jfox.ioc.ComponentName;
18 import org.jfox.ioc.depend.DependencyPack;
19 import org.jfox.ioc.depend.ObjectDependency;
20
21 /**
22  * 执行在 EJBObject EJBHome 中定义的方法
23  *
24  * @author <a HREF="mailto:young_yy@hotmail.com">Young Yang</a>
25  */

26
27 public class StatelessBucket extends SessionBucket {
28
29     private StatelessObjectPool instancePool = null;
30     /**
31      * StatlessSessionBean 每次返回同样的ObjectId
32      */

33     private EJBObjectId beanObjectId = null;
34     private SessionContext JavaDoc ejbConext = null;
35
36     public StatelessBucket() {
37
38     }
39
40     // 对于 StatelessSessionBean,这个方法不执行任何操作
41
public void remove(Handle JavaDoc handle) throws RemoteException JavaDoc, RemoveException JavaDoc {
42         try {
43             EJBPoolableObject pobj = (EJBPoolableObject) instancePool.retrieveObject();
44             remove(pobj.getBeanInstance());
45         }
46         catch(Exception JavaDoc e) {
47             throw new RemoveException JavaDoc(e.getMessage());
48         }
49     }
50
51     public void remove(EnterpriseBean JavaDoc bean) throws RemoteException JavaDoc, RemoveException JavaDoc {
52         ejbRemove((SessionBean JavaDoc) bean);
53     }
54
55     // 对于 StatelessSessionBean, 总是返回 true
56
public boolean isIdentical(EJBObjectId thisObjectId, EJBObjectId thatObjectId) throws RemoteException JavaDoc {
57         return true;
58     }
59
60     public EJBPoolableObject retrieveBean(Object JavaDoc key) throws Exception JavaDoc {
61         StatelessPoolableObject pobj = (StatelessPoolableObject) instancePool.retrieveObject();
62         if(!pobj.isEjbCreated()) { // 新生的对象,要调用 setSessionContext, ejbCreate
63
SessionBean JavaDoc bean = (SessionBean JavaDoc) pobj.getBeanInstance();
64             setContext(bean, ejbConext);
65             ejbCreate(bean, "create", null);
66             pobj.ejbCreated();
67         }
68         return pobj;
69     }
70
71     public void restoreBean(Object JavaDoc key, EJBPoolableObject pobj) {
72         instancePool.restoreObject(pobj);
73     }
74
75     public EJBObjectId createBean(EJBInvocation invocation) throws Exception JavaDoc {
76         if(beanObjectId == null) { // 第一次调用 create ,生成 beanObjectId,ejbContext
77
beanObjectId = nextObjectId();
78             ejbConext = new SessionContextImpl(beanObjectId, bucketMeta);
79         }
80         StatelessPoolableObject pobj = (StatelessPoolableObject) instancePool.createObject();
81         if(!pobj.isEjbCreated()) { // 新生的对象,要调用 setSessionContext, ejbCreate
82
SessionBean JavaDoc bean = (SessionBean JavaDoc) pobj.getBeanInstance();
83             setContext(bean, ejbConext);
84             // stateless session bean 只有一个没有参数的 ejbCreate 方法
85
ejbCreate(bean, "create", null);
86             pobj.ejbCreated();
87         }
88         this.restoreBean(invocation.getObjectId(), pobj);
89         return beanObjectId;
90     }
91
92     public void syncBean(EJBInvocation invocation) {
93         //don't need sync in statless bean
94
/*
95         ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
96         ClassLoader cl = this.getEJBClassLoader();
97         try {
98             Thread.currentThread().setContextClassLoader(cl);
99             //invocation.getTargetObject 需要用到EJBClassLoader
100             EnterpriseBean bean = (EnterpriseBean) invocation.getTargetObject();
101             EJBPoolableObject pobj = (EJBPoolableObject) instancePool.createObject();
102             pobj.setBeanInstance(bean);
103             this.restoreBean(invocation.getObjectId(), pobj);
104         }
105         catch(Exception e) {
106             logger.warn("pool.createObject failed.", e);
107         }
108         finally {
109             Thread.currentThread().setContextClassLoader(oldCL);
110         }
111 */

112     }
113
114     protected void doInit() throws Exception JavaDoc {
115         super.doInit();
116         instancePool = (StatelessObjectPool)context.getRegistry().getComponentInstance(
117                                 ComponentName.newInstance(StatelessObjectPool.class),
118                                 new DependencyPack[]{
119                                     new DependencyPack("EJBObjectFactory",
120                                                       new ObjectDependency(new StatelessObjectFactory(StatelessPoolableObject.class, this)))});
121     }
122
123     protected void doDestroy() throws Exception JavaDoc {
124         super.doDestroy();
125         instancePool.destroy();
126     }
127 }
Popular Tags