在spring mvc中一般采用xml配置一些第三方属性,而spring boot比较多还是采用@Configuration注解方式,那么如何将xml中配置转换成@Configuration配置呢?下面以配置线程池ThreadPoolTaskExecutor为例。
xml配置如下:
<!-- 线程池配置 --> <bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 线程池维护线程的最少数量 --> <property name="corePoolSize" value="50"/> <!-- 线程池维护线程的最大数量,默认为Integer.MAX_VALUE --> <property name="maxPoolSize" value="100"/> <!-- 线程池所使用的缓冲队列,一般需要设置值>=notifyScheduledMainExecutor.maxNum;默认为Integer.MAX_VALUE --> <property name="queueCapacity" value="200"/> <!-- 线程池维护线程所允许的空闲时间,默认为60s --> <property name="keepAliveSeconds" value="300"/> <!-- 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者 --> <property name="rejectedExecutionHandler"> <!-- AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常 --> <!-- CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度 --> <!-- DiscardOldestPolicy:抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行 --> <!-- DiscardPolicy:抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行 --> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/> </property> </bean>
新建MyThreadPoolConfig类,作为配置类,具体代码如何下
package com.test.mqtest.config;
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
public class MyThreadPoolConfig {
private int corePoolSize = 50;//线程池维护线程的最少数量
private int maxPoolSize = 100;//线程池维护线程的最大数量
private int queueCapacity = 200; //缓存队列
private int keepAlive = 300;//允许的空闲时间
@Bean
public ThreadPoolTaskExecutor threadPoolExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix("mqExecutor-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //对拒绝task的处理策略
executor.setKeepAliveSeconds(keepAlive);
executor.initialize();
return executor;
}
}
如何使用呢?采用注解方式,如下:
@Autowired
ThreadPoolTaskExecutor threadPoolTaskExecutor;
另外一种方法,使用@ImportResource("classpath:MyThreadPoolConfig.xml")引用xml文件。
package com.test.mqtest.config;
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
public class MyThreadPool {
@Configuration
@ImportResource("classpath:MyThreadPoolConfig.xml")
static class MyThreadPoolConfig {
}
}