001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. The ASF licenses this file to You
004: * under the Apache License, Version 2.0 (the "License"); you may not
005: * use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License. For additional information regarding
015: * copyright in this work, please see the NOTICE file in the top level
016: * directory of this distribution.
017: *
018: * Modified for Nabh
019: */
020: package com.nabhinc.ws.service.thread;
021:
022: import EDU.oswego.cs.dl.util.concurrent.BoundedBuffer;
023: import EDU.oswego.cs.dl.util.concurrent.DirectExecutor;
024: import EDU.oswego.cs.dl.util.concurrent.PooledExecutor;
025: import EDU.oswego.cs.dl.util.concurrent.ThreadFactory;
026:
027: import java.util.Date;
028: import java.util.Timer;
029: import java.util.TimerTask;
030:
031: import com.nabhinc.util.DateUtil;
032: import com.nabhinc.ws.service.core.BaseJavaWebService;
033:
034: public class ThreadManagerService extends BaseJavaWebService {
035: public static final long MIN_RATE_INTERVAL_MINS = 1;
036: private PooledExecutor backgroundExecutor;
037: private DirectExecutor nodelayExecutor;
038: private Timer scheduler;
039:
040: public ThreadManagerService() {
041: backgroundExecutor = new PooledExecutor(new BoundedBuffer(10),
042: 25);
043: backgroundExecutor.setMinimumPoolSize(4);
044: backgroundExecutor.setKeepAliveTime(1000 * 60 * 5);
045: backgroundExecutor.waitWhenBlocked();
046: backgroundExecutor.createThreads(9);
047:
048: backgroundExecutor.setThreadFactory(new ThreadFactory() {
049: public Thread newThread(Runnable command) {
050: Thread t = new Thread(command);
051: t.setDaemon(false);
052: t.setName("Background Execution Threads");
053: t.setPriority(Thread.NORM_PRIORITY);
054:
055: return t;
056: }
057: });
058:
059: nodelayExecutor = new DirectExecutor();
060: scheduler = new Timer(true);
061: }
062:
063: public void executeInBackground(Runnable runnable)
064: throws InterruptedException {
065: backgroundExecutor.execute(runnable);
066: }
067:
068: public void executeInForeground(Runnable runnable)
069: throws InterruptedException {
070: nodelayExecutor.execute(runnable);
071: }
072:
073: public void scheduleDailyTimerTask(TimerTask task) {
074: scheduler.scheduleAtFixedRate(task, DateUtil
075: .getEndOfDay(new Date()), DateUtil.millisInDay);
076: }
077:
078: public void scheduleHourlyTimerTask(TimerTask task) {
079: scheduler.scheduleAtFixedRate(task, new Date(), 60 * 60 * 1000);
080: }
081:
082: public void scheduleFixedRateTimerTask(TimerTask task,
083: long delayMins, long periodMins) {
084: if (periodMins < MIN_RATE_INTERVAL_MINS) {
085: throw new IllegalArgumentException("Period (" + periodMins
086: + ") shorter than minimum allowed ("
087: + MIN_RATE_INTERVAL_MINS + ")");
088: }
089: scheduler.scheduleAtFixedRate(task, delayMins * 60 * 1000,
090: periodMins * 60 * 1000);
091: }
092:
093: public void destroy() {
094: backgroundExecutor
095: .shutdownAfterProcessingCurrentlyQueuedTasks();
096: scheduler.cancel();
097: }
098:
099: public void release() {
100: }
101:
102: }
|