KickJava   Java API By Example, From Geeks To Geeks.

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


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.NoSuchObjectException JavaDoc;
10 import java.util.HashMap JavaDoc;
11 import java.util.Iterator JavaDoc;
12 import java.util.Map JavaDoc;
13 import javax.ejb.SessionBean JavaDoc;
14
15 import org.jfox.ioc.ComponentName;
16 import org.jfox.ioc.common.AbstractComponent;
17 import org.jfox.persistent.Persistenter;
18 import org.jfox.pool.AbstractObjectPool;
19 import org.jfox.pool.IndexableObjectPool;
20 import org.jfox.pool.ObjectFactory;
21 import org.jfox.pool.PoolableObject;
22 import org.jfox.pool.SimpleObjectPool;
23
24 /**
25  * @author <a HREF="mailto:young_yy@hotmail.com">Young Yang</a>
26  */

27
28 public class StatefulObjectPool extends AbstractComponent implements IndexableObjectPool,EJBObjectPool {
29     private AbstractObjectPool pool = null;
30     private EJBObjectFactory factory = null;
31     // 在使用的对象(ObjectID <=> EJB)
32
private Map JavaDoc caches = null;
33     // 记录每个 Bean 最后返回 pool 的时间
34
private Map JavaDoc timeouts = null;
35
36     private Bucket bucket = null;
37
38     // bean 允许的最大休眠时间
39
final static long MAX_LIFE_TIME = 60 * 60 * 1000L; // one hour
40
private final static long MAX_PASSIVATE_TIME = MAX_LIFE_TIME * 24 * 7; // one week
41

42     private static StatefulManager lifecycleManger = new StatefulManager();
43     private Persistenter persistent = null;
44
45     public StatefulObjectPool() {
46
47     }
48
49     public void setEJBObjectFactory(EJBObjectFactory factory) {
50         this.factory = factory;
51     }
52
53     public PoolableObject createObject() throws Exception JavaDoc {
54         return pool.retrieveObject();
55     }
56
57     public synchronized PoolableObject retrieveObject(Object JavaDoc key) throws Exception JavaDoc {
58         // 该 bean 被调用了,所以从 timeout 中删除,计时消除,在 restore 的时候,重新开始计时
59
timeouts.remove(key);
60         // 不在二级 cache 中,有可能已经 passivate 了
61
if(!caches.containsKey(key)) {
62             try {
63                 EJBPoolableObject pobj = activateObject(key);
64                 //不要立即放到caches 中,在调用完成后, restoreObject的时候再返回
65
// caches.put(key,pobj);
66
return pobj;
67             }
68             catch(Exception JavaDoc e) {
69                 e.printStackTrace();
70             }
71             // 在 passivate 库中找不到,抛出异常
72
throw new NoSuchObjectException JavaDoc(key.toString());
73         }
74         else {
75             return (PoolableObject) caches.remove(key);
76         }
77     }
78
79     /**
80      * 如果池中已经有该 key 存在,返回 false,没有则返回 true
81      *
82      * @param key
83      * @param obj
84      * @return
85      */

86     public boolean restoreObject(Object JavaDoc key, PoolableObject obj) {
87         // 记录最后返回的时间,时间超过 60m,将把其序列化
88
timeouts.put(key, new Long JavaDoc(System.currentTimeMillis()));
89
90         if(caches.containsKey(key)) {
91             logger.warn("key " + key + " is existed,overwrite!");
92             caches.put(key, obj);
93             return false;
94         }
95         else {
96             caches.put(key, obj);
97             return true;
98         }
99     }
100
101     public boolean removeObject(Object JavaDoc key) {
102         logger.debug("removeObject with key - " + key);
103         timeouts.remove(key);
104         try {
105             SessionBean JavaDoc sb = loadObject(key);
106             if(sb != null) {
107                 bucket.ejbRemove(sb);
108                 persistent.remove(key);
109                 return true;
110             }
111             else {
112                 return false;
113             }
114         }
115         catch(Exception JavaDoc e) {
116             logger.warn(e);
117             return false;
118         }
119     }
120
121     public boolean passivateObject(Object JavaDoc key) {
122         if(!caches.containsKey(key)) return false;
123         logger.debug("passivateObject with key - " + key);
124         // 不要从 timeouts 移除,因为还要为 removeObject 计时
125
// timeouts.remove(key);
126
EJBPoolableObject pobj = (EJBPoolableObject) caches.remove(key);
127         try {
128             bucket.ejbPassivate((SessionBean JavaDoc) pobj.getBeanInstance());
129             persistent.store(key, pobj.getBeanInstance());
130             pobj = null;
131             return true;
132         }
133         catch(Exception JavaDoc e) {
134             logger.warn(e);
135             return false;
136         }
137     }
138
139     public EJBPoolableObject activateObject(Object JavaDoc key) throws Exception JavaDoc {
140         logger.debug("activateObject with key - " + key);
141         SessionBean JavaDoc sb = loadObject(key);
142         bucket.ejbActivate(sb);
143         EJBPoolableObject pobj = new EJBPoolableObject();
144         pobj.setBeanInstance(sb);
145         return pobj;
146     }
147
148     private SessionBean JavaDoc loadObject(Object JavaDoc key) throws Exception JavaDoc {
149 // logger.debug("loadObject with key - " + key );
150
SessionBean JavaDoc sb = (SessionBean JavaDoc) persistent.load(key);
151         return sb;
152     }
153
154     public void clear() {
155         synchronized(caches) {
156             for(Iterator JavaDoc it = caches.values().iterator(); it.hasNext();) {
157                 EJBPoolableObject pobj = (EJBPoolableObject) it.next();
158                 try {
159                     bucket.ejbPassivate((SessionBean JavaDoc) (((EJBPoolableObject) pobj).getBeanInstance()));
160                 }
161                 catch(Exception JavaDoc e) {
162                     logger.warn("ejbRemove failed, exception is: " + e.toString());
163                 }
164             }
165             caches.clear();
166         }
167         timeouts.clear();
168         pool.clear();
169     }
170
171     public ObjectFactory getObjectFactory() {
172         return factory;
173     }
174
175     public int getWorking() {
176         return caches.size();
177     }
178
179     public int getRest() {
180         return pool.getRest();
181     }
182
183     protected void doInit() throws Exception JavaDoc {
184         if(factory == null) throw new NullPointerException JavaDoc("factory is null.");
185         bucket = factory.getBucket();
186         timeouts = new HashMap JavaDoc();
187         caches = new HashMap JavaDoc();
188         pool = new SimpleObjectPool(factory);
189         pool.init();
190
191         persistent = (Persistenter)context.getRegistry().getComponentInstance(ComponentName.parseString("org.jfox.persistent.Persistenter@File"));
192
193         lifecycleManger.manageIt(this);
194     }
195
196     protected void doDestroy() throws Exception JavaDoc {
197         clear();
198         lifecycleManger.unmanageIt(this);
199         caches = null;
200         pool = null;
201     }
202
203     /**
204      * 对缓存的对象进行生命周期检查
205      */

206     public void lifecycleCheck() {
207         logger.debug("Lifecycle checking... " + timeouts.size() + ", " + bucket.getEJBDescriptor().getRemoteClassName());
208         long now = System.currentTimeMillis();
209 // logger.info("sleep time " + now + ", " + lastActive);
210
if(timeouts.size() == 0) return;
211         for(Iterator JavaDoc it = new HashMap JavaDoc(timeouts).entrySet().iterator(); it.hasNext();) {
212             Map.Entry JavaDoc entry = (Map.Entry JavaDoc) it.next();
213             long lastActive = ((Long JavaDoc) entry.getValue()).longValue();
214
215             if((now - lastActive) > MAX_PASSIVATE_TIME) {
216                 removeObject(entry.getKey());
217                 continue;
218             }
219             if((now - lastActive) > MAX_LIFE_TIME) {
220                 passivateObject(entry.getKey());
221             }
222         }
223     }
224
225     public static void main(String JavaDoc[] args) {
226
227     }
228 }
Popular Tags