View Javadoc

1   /*
2    * Copyright 2006-2011 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.kuali.rice.ksb.messaging.threadpool;
18  
19  import org.apache.log4j.Logger;
20  import org.kuali.rice.core.api.config.property.ConfigContext;
21  import org.kuali.rice.ksb.util.KSBConstants;
22  
23  import java.util.concurrent.Executors;
24  import java.util.concurrent.ScheduledThreadPoolExecutor;
25  import java.util.concurrent.ThreadFactory;
26  import java.util.concurrent.TimeUnit;
27  
28  public class KSBScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor implements KSBScheduledPool {
29  
30  	private static final Logger LOG = Logger.getLogger(KSBScheduledThreadPoolExecutor.class);
31  
32  	private boolean started;
33  	private static final int DEFAULT_SIZE = 2;
34  
35  	public KSBScheduledThreadPoolExecutor() {
36  		super(DEFAULT_SIZE, new KSBThreadFactory());
37  	}
38  
39  	public boolean isStarted() {
40  		return started;
41  	}
42  
43  	public void start() throws Exception {
44  		LOG.info("Starting the KSB scheduled thread pool...");
45  		try {
46  			Integer size = new Integer(ConfigContext.getCurrentContextConfig().getProperty(KSBConstants.Config.FIXED_POOL_SIZE));
47  			this.setCorePoolSize(size);
48  		} catch (NumberFormatException nfe) {
49  			// ignore this, instead the pool will be set to DEFAULT_SIZE
50  		}
51  		LOG.info("...KSB scheduled thread pool successfully started.");
52  	}
53  
54  	public void stop() throws Exception {
55  		LOG.info("Stopping the KSB scheduled thread pool...");
56  		try {
57  			this.shutdownNow();
58  			LOG.info("awaiting termination: " + this.awaitTermination(20, TimeUnit.SECONDS));
59  			LOG.info("...KSB scheduled thread pool successfully stopped, isShutdown=" + this.isShutdown());
60  		} catch (Exception e) {
61  			LOG.warn("Exception thrown shutting down " + KSBScheduledThreadPoolExecutor.class.getSimpleName(), e);
62  		}
63  
64  	}
65  	
66  	private static class KSBThreadFactory implements ThreadFactory {
67  		
68  		private ThreadFactory defaultThreadFactory = Executors.defaultThreadFactory();
69  		
70  		public Thread newThread(Runnable runnable) {
71  			Thread thread = defaultThreadFactory.newThread(runnable);
72  			thread.setName("KSB-Scheduled-" + thread.getName());
73  			return thread;
74  	    }
75  	}
76  
77  }