001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.builder;
018    
019    import java.util.concurrent.ExecutorService;
020    import java.util.concurrent.ScheduledExecutorService;
021    import java.util.concurrent.TimeUnit;
022    
023    import org.apache.camel.CamelContext;
024    import org.apache.camel.ThreadPoolRejectedPolicy;
025    import org.apache.camel.spi.ThreadPoolProfile;
026    
027    /**
028     * A builder to create thread pools.
029     *
030     * @version 
031     */
032    public final class ThreadPoolBuilder {
033    
034        // reuse a profile to store the settings
035        private final ThreadPoolProfile profile;
036        private final CamelContext context;
037    
038        public ThreadPoolBuilder(CamelContext context) {
039            this.context = context;
040            this.profile = new ThreadPoolProfile();
041        }
042        
043        public ThreadPoolBuilder poolSize(int poolSize) {
044            profile.setPoolSize(poolSize);
045            return this;
046        }
047    
048        public ThreadPoolBuilder maxPoolSize(int maxPoolSize) {
049            profile.setMaxPoolSize(maxPoolSize);
050            return this;
051        }
052        
053        public ThreadPoolBuilder keepAliveTime(long keepAliveTime, TimeUnit timeUnit) {
054            profile.setKeepAliveTime(keepAliveTime);
055            profile.setTimeUnit(timeUnit);
056            return this;
057        }
058    
059        public ThreadPoolBuilder keepAliveTime(long keepAliveTime) {
060            profile.setKeepAliveTime(keepAliveTime);
061            return this;
062        }
063    
064        public ThreadPoolBuilder maxQueueSize(int maxQueueSize) {
065            profile.setMaxQueueSize(maxQueueSize);
066            return this;
067        }
068    
069        public ThreadPoolBuilder rejectedPolicy(ThreadPoolRejectedPolicy rejectedPolicy) {
070            profile.setRejectedPolicy(rejectedPolicy);
071            return this;
072        }
073        
074        /**
075         * Builds the new thread pool
076         *
077         * @return the created thread pool
078         * @throws Exception is thrown if error building the thread pool
079         */
080        public ExecutorService build() throws Exception {
081            return build(null, null);
082        }
083    
084        /**
085         * Builds the new thread pool
086         *
087         * @param name name which is appended to the thread name
088         * @return the created thread pool
089         * @throws Exception is thrown if error building the thread pool
090         */
091        public ExecutorService build(String name) throws Exception {
092            return build(null, name);
093        }
094    
095        /**
096         * Builds the new thread pool
097         *
098         * @param source the source object, usually it should be <tt>this</tt> passed in as parameter
099         * @param name   name which is appended to the thread name
100         * @return the created thread pool
101         * @throws Exception is thrown if error building the thread pool
102         */
103        public ExecutorService build(Object source, String name) throws Exception {
104            return context.getExecutorServiceManager().newThreadPool(source, name, profile);
105        }
106    
107        /**
108         * Builds the new scheduled thread pool
109         *
110         * @return the created scheduled thread pool
111         * @throws Exception is thrown if error building the scheduled thread pool
112         */
113        public ScheduledExecutorService buildScheduled() throws Exception {
114            return buildScheduled(null, null);
115        }
116    
117        /**
118         * Builds the new scheduled thread pool
119         *
120         * @param name name which is appended to the thread name
121         * @return the created scheduled thread pool
122         * @throws Exception is thrown if error building the scheduled thread pool
123         */
124        public ScheduledExecutorService buildScheduled(String name) throws Exception {
125            return buildScheduled(null, name);
126        }
127    
128        /**
129         * Builds the new scheduled thread pool
130         *
131         * @param source the source object, usually it should be <tt>this</tt> passed in as parameter
132         * @param name   name which is appended to the thread name
133         * @return the created scheduled thread pool
134         * @throws Exception is thrown if error building the scheduled thread pool
135         */
136        public ScheduledExecutorService buildScheduled(Object source, String name) throws Exception {
137            return context.getExecutorServiceManager().newScheduledThreadPool(source, name, profile);
138        }
139    
140    }