KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jcorporate > expresso > core > cache > CacheCleaner


1 /* ====================================================================
2  * The Jcorporate Apache Style Software License, Version 1.2 05-07-2002
3  *
4  * Copyright (c) 1995-2002 Jcorporate Ltd. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in
15  * the documentation and/or other materials provided with the
16  * distribution.
17  *
18  * 3. The end-user documentation included with the redistribution,
19  * if any, must include the following acknowledgment:
20  * "This product includes software developed by Jcorporate Ltd.
21  * (http://www.jcorporate.com/)."
22  * Alternately, this acknowledgment may appear in the software itself,
23  * if and wherever such third-party acknowledgments normally appear.
24  *
25  * 4. "Jcorporate" and product names such as "Expresso" must
26  * not be used to endorse or promote products derived from this
27  * software without prior written permission. For written permission,
28  * please contact info@jcorporate.com.
29  *
30  * 5. Products derived from this software may not be called "Expresso",
31  * or other Jcorporate product names; nor may "Expresso" or other
32  * Jcorporate product names appear in their name, without prior
33  * written permission of Jcorporate Ltd.
34  *
35  * 6. No product derived from this software may compete in the same
36  * market space, i.e. framework, without prior written permission
37  * of Jcorporate Ltd. For written permission, please contact
38  * partners@jcorporate.com.
39  *
40  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
41  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
42  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
43  * DISCLAIMED. IN NO EVENT SHALL JCORPORATE LTD OR ITS CONTRIBUTORS
44  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
45  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
46  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
47  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
48  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
49  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
50  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  * ====================================================================
53  *
54  * This software consists of voluntary contributions made by many
55  * individuals on behalf of the Jcorporate Ltd. Contributions back
56  * to the project(s) are encouraged when you make modifications.
57  * Please send them to support@jcorporate.com. For more information
58  * on Jcorporate Ltd. and its products, please see
59  * <http://www.jcorporate.com/>.
60  *
61  * Portions of this software are based upon other open source
62  * products and are subject to their respective licenses.
63  */

64
65 package com.jcorporate.expresso.core.cache;
66
67 import EDU.oswego.cs.dl.util.concurrent.CopyOnWriteArrayList;
68 import com.jcorporate.expresso.core.registry.ExpressoThread;
69 import org.apache.log4j.Logger;
70
71 import java.util.Iterator JavaDoc;
72
73 /**
74  * This thread is initialized by CacheManager and slowly iterates through the
75  * Caches clearing out expired items. It often is given a lower thread priority
76  * so it doesn't take away from the app server during high use times.
77  * <p/>
78  * By using this thread, we save significant memory by removing expired items before
79  * they are accessed again.
80  * </p>
81  * <p>Typical Usage:<br/>
82  * <code><pre>
83  * CacheCleaner cacheCleaner = new CacheCleaner();
84  * cacheCleaner.registerCacheSystem(defaultContextCacheSystem);
85  * cacheCleaner.start();
86  * .....
87  * .....
88  * //To shut down. May take a while.
89  * cacheCleaner.interrupt();
90  * cacheCleaner.join();
91  * <p/>
92  * </pre></code></p>
93  *
94  * @author Michael Rimov
95  */

96
97 public class CacheCleaner extends ExpressoThread {
98     private static final transient Logger log = Logger.getLogger(CacheCleaner.class);
99
100     private CopyOnWriteArrayList cacheSystems = new CopyOnWriteArrayList();
101
102     private boolean done = false;
103
104     protected CacheCleaner() {
105         super();
106     }
107
108     /**
109      * Register a cache system for iteration. During a pass of the cache,
110      * the CacheCleaner will iterate all registered CacheSystems
111      *
112      * @param newCache the CacheSystem instance to be cleaning.
113      */

114     public void registerCacheSystem(CacheSystem newCache) {
115         cacheSystems.add(newCache);
116         if (log.isDebugEnabled()) {
117             log.debug("Registering cache system: " + ((Object JavaDoc) newCache).toString() + " for cleaning");
118         }
119     }
120
121
122     /**
123      * The cache cleaner run method iterates through all the cache systems installed
124      * in the system and forces the removal of any items that have expired. It
125      * automatically runs every 30 seconds.
126      */

127     public void run() {
128         super.run();
129
130         if (log.isDebugEnabled()) {
131             log.debug("Starting Cache Cleaning");
132         }
133
134         while (!this.isInterrupted() && !done) {
135             for (Iterator JavaDoc i = cacheSystems.iterator(); i.hasNext();) {
136                 //
137
//Check for interruption after each cache system iteration
138
//
139
if (this.isInterrupted()) {
140                     return;
141                 }
142
143                 CacheSystem oneCacheSystem = (CacheSystem) i.next();
144
145                 if (log.isDebugEnabled()) {
146                     log.debug("Cleaning cache system: " + ((Object JavaDoc) oneCacheSystem).toString());
147                 }
148
149                 oneCacheSystem.adjustForMemory();
150
151                 for (Iterator JavaDoc j = oneCacheSystem.getAllCacheNames().iterator();
152                      j.hasNext();) {
153                     String JavaDoc oneCacheName = (String JavaDoc) j.next();
154                     Cache oneCache = oneCacheSystem.getCache(oneCacheName);
155                     if (oneCache != null) {
156                         //
157
//GetItems will automatically check each item in the
158
//cache and remove any expired items.
159
//
160
oneCache.getItems();
161                     }
162                 }
163             }
164
165             if (isInterrupted()) {
166                 break;
167             } else {
168                 try {
169                     //Free some CPU time... we don't always need to be running
170
//So we take a 30 second break.
171
sleep(30000);
172                 } catch (InterruptedException JavaDoc ex) {
173                     break;
174                 }
175             }
176         }
177
178         if (log.isDebugEnabled()) {
179             log.debug("Cache cleaner exiting.");
180         }
181     }
182
183     public void interrupt() {
184         done = true;
185         super.interrupt();
186     }
187 }
188
Popular Tags