KickJava   Java API By Example, From Geeks To Geeks.

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


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.lang.reflect.Proxy JavaDoc;
10 import java.rmi.RemoteException JavaDoc;
11 import javax.ejb.EJBObject JavaDoc;
12 import javax.ejb.EnterpriseBean JavaDoc;
13 import javax.ejb.Handle JavaDoc;
14 import javax.ejb.RemoveException JavaDoc;
15 import javax.ejb.SessionBean JavaDoc;
16
17 import org.jfox.ejb.connector.EJBInvocation;
18 import org.jfox.ioc.ComponentName;
19 import org.jfox.ioc.connector.ConnectorInvoker;
20 import org.jfox.ioc.depend.DependencyPack;
21 import org.jfox.ioc.depend.ObjectDependency;
22
23 /**
24  * @author <a HREF="mailto:young_yy@hotmail.com">Young Yang</a>
25  */

26
27 public class StatefulBucket extends SessionBucket {
28
29     private StatefulObjectPool instancePool = null;
30
31     public StatefulBucket() {
32
33     }
34
35     public void remove(EnterpriseBean JavaDoc bean) throws RemoteException JavaDoc, RemoveException JavaDoc {
36         ejbRemove((SessionBean JavaDoc) bean);
37     }
38
39     public void remove(Handle JavaDoc handle) throws RemoteException JavaDoc, RemoveException JavaDoc {
40         EJBObject JavaDoc ejbObject = handle.getEJBObject();
41         // Handle 实际上是一个代理对象,保存了 ObjectId 在里面
42
EJBObjectId objectId = (EJBObjectId)(((ConnectorInvoker) Proxy.getInvocationHandler(ejbObject)).getClientId());
43         try {
44             EJBPoolableObject pobj = (EJBPoolableObject) instancePool.retrieveObject(objectId);
45             remove(pobj.getBeanInstance());
46         }
47         catch(Exception JavaDoc e) {
48             throw new RemoveException JavaDoc(e.getMessage());
49         }
50     }
51
52     public boolean isIdentical(EJBObjectId thisObjectId, EJBObjectId thatObjectId) throws RemoteException JavaDoc {
53         return thisObjectId.equals(thatObjectId);
54     }
55
56     public EJBPoolableObject retrieveBean(Object JavaDoc key) {
57         try {
58             return (EJBPoolableObject) instancePool.retrieveObject(key);
59         }
60         catch(Exception JavaDoc e) {
61             e.printStackTrace();
62             return null;
63         }
64     }
65
66     public void restoreBean(Object JavaDoc key, EJBPoolableObject pobj) {
67         instancePool.restoreObject(key, pobj);
68     }
69
70     public EJBObjectId createBean(EJBInvocation invocation) throws Exception JavaDoc {
71         EJBObjectId beanObjectId = nextObjectId();
72         EJBPoolableObject pobj = (EJBPoolableObject) instancePool.createObject();
73         SessionBean JavaDoc bean = (SessionBean JavaDoc) pobj.getBeanInstance();
74         setContext(bean, new SessionContextImpl(beanObjectId, bucketMeta));
75         ejbCreate(bean, invocation.getMethod().getName(), invocation.getArgs());
76         instancePool.restoreObject(beanObjectId, pobj);
77         return beanObjectId;
78     }
79
80     public void syncBean(EJBInvocation invocation) {
81         ClassLoader JavaDoc oldCL = Thread.currentThread().getContextClassLoader();
82         ClassLoader JavaDoc cl = this.getEJBClassLoader();
83         try {
84             Thread.currentThread().setContextClassLoader(cl);
85             //invocation.getTargetObject 需要用到EJBClassLoader
86
EnterpriseBean JavaDoc bean = (EnterpriseBean JavaDoc) invocation.getTargetObject();
87             EJBPoolableObject pobj = (EJBPoolableObject) instancePool.createObject();
88             pobj.setBeanInstance(bean);
89             //TODO: 如果该ejbObjectId已经存在了,需要覆盖它
90
this.restoreBean(invocation.getObjectId(), pobj);
91         }
92         catch(Exception JavaDoc e) {
93             logger.warn("pool.createObject failed.", e);
94         }
95         finally {
96             Thread.currentThread().setContextClassLoader(oldCL);
97         }
98     }
99
100     protected void doInit() throws Exception JavaDoc {
101 // instancePool = new StatefulObjectPool(this, new EJBObjectFactory(EJBPoolableObject.class, bucketMeta.getBeanClass()));
102
// instancePool.init();
103
super.doInit();
104         instancePool = (StatefulObjectPool) context.getRegistry().getComponentInstance(
105                 ComponentName.newInstance(StatefulObjectPool.class),
106                 new DependencyPack[]{new DependencyPack("EJBObjectFactory",
107                                                       new ObjectDependency(new StatefulObjectFactory(StatefulPoolableObject.class, this))),
108                                     });
109
110     }
111
112     protected void doDestroy() throws Exception JavaDoc {
113         super.doDestroy();
114         // 销毁 instancePool 的时候,会序列化所有的实例,并且不再受 LifeCycleManager 的监控
115
instancePool.destroy();
116     }
117
118     public static void main(String JavaDoc[] args) {
119
120     }
121 }
Popular Tags