KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jcorporate > expresso > services > crontab > CronDaemon


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.services.crontab;
66
67 import com.jcorporate.expresso.core.registry.ExpressoThread;
68 import com.jcorporate.expresso.core.registry.MutableRequestRegistry;
69 import com.jcorporate.expresso.core.security.SuperUser;
70
71
72 /**
73  * This class provides the thread for listening on various crontabs. It notifies
74  * the crontab when it's time to notify a listener.
75  *
76  * @author Mike Dubman
77  * @version 1.0
78  */

79 public class CronDaemon
80         implements Runnable JavaDoc {
81
82     protected Crontab mgr;
83     protected Thread JavaDoc thread;
84     private long sleepUntil = -1;
85     private boolean shutdown = false;
86
87     public CronDaemon(Crontab mgr, boolean isDaemon, String JavaDoc waiterName) {
88         this.mgr = mgr;
89         thread = new ExpressoThread(this, waiterName);
90         thread.setDaemon(isDaemon);
91         thread.start();
92     }
93
94     /**
95      * Updates the time it should sleep until
96      *
97      * @param sleepUntil absolute system time to sleep until
98      */

99     public synchronized void update(long sleepUntil) {
100         this.sleepUntil = sleepUntil;
101         notify();
102     }
103
104     /**
105      * Restarts the cron daemon
106      *
107      * @param sleepUntil the absolute time to sleep until
108      */

109     public synchronized void restart(long sleepUntil) {
110         this.sleepUntil = sleepUntil;
111         notify();
112     }
113
114     /**
115      * Stops the thread
116      */

117     public synchronized void stop() {
118         shutdown = true;
119         notify();
120     }
121
122     public synchronized void run() {
123         //Set registry context.
124
new MutableRequestRegistry("default", SuperUser.SUPER_USER);
125
126         while (!shutdown) {
127             try {
128
129                 // check if there's crontab entries here
130
if (sleepUntil <= 0) {
131
132                     // no crontab entry here. So wait for a new crontab entry to come along.
133
wait();
134                 } else {
135
136                     // yes, there's an crontab entry here. Wait until the crontab entry is ready.
137
long timeout = sleepUntil - System.currentTimeMillis();
138
139                     if (timeout > 0) {
140                         wait(timeout);
141                     }
142                 }
143                 // now that we've awakened again, check if an crontab entry is due (within
144
// 1 second)
145
if (sleepUntil >= 0 &&
146                         (sleepUntil - System.currentTimeMillis() < 1000)) {
147
148                     // yes, an crontab entry is ready. Notify the listeners.
149
sleepUntil = -1;
150                     mgr.notifyListeners();
151                 }
152             } catch (InterruptedException JavaDoc e) {
153
154             }
155         }
156     }
157 }
158
Popular Tags