/*
* Copyright 2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.codecentric.batch.configuration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import de.codecentric.batch.scheduling.concurrent.MdcThreadPoolTaskExecutor;
/**
* This is the default configuration for a {@link org.springframework.core.task.TaskExecutor} used in the {@link org.springframework.batch.core.launch.support.SimpleJobLauncher}
* for starting jobs asynchronously. Its core thread pool is configured to five threads by default, which can be changed
* by setting the property batch.core.pool.size to a different number.
*
* Please note the following rules of the ThreadPoolExecutor:
* If the number of threads is less than the corePoolSize, the executor creates a new thread to run a new task.
* If the number of threads is equal (or greater than) the corePoolSize, the executor puts the task into the queue.
* If the queue is full and the number of threads is less than the maxPoolSize, the executor creates a new thread to run a new task.
* If the queue is full and the number of threads is greater than or equal to maxPoolSize, reject the task.
*
* So with the default configuration there will be only 5 jobs/threads at the same time.
*
* The {@link org.springframework.core.task.TaskExecutor} may also be used in job configurations
* for multi-threaded job execution. In XML you can use it by name, which is taskExecutor. In JavaConfig,
* you can either autowire {@link org.springframework.core.task.TaskExecutor} or, if you want to know
* where it's configured, this class.
*
* @author Dennis Schulte
*
*/
@Configuration
@ConditionalOnMissingBean(TaskExecutor.class)
public class TaskExecutorConfiguration {
@Autowired
private Environment env;
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new MdcThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(env.getProperty("batch.core.pool.size", Integer.class, 5));
taskExecutor.setQueueCapacity(env.getProperty("batch.queue.capacity", Integer.class, Integer.MAX_VALUE));
taskExecutor.setMaxPoolSize(env.getProperty("batch.max.pool.size", Integer.class, Integer.MAX_VALUE));
taskExecutor.afterPropertiesSet();
return taskExecutor;
}
}