spring的配置文件中配置线程池
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd"
default-autowire="byName" default-lazy-init="false">
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>File:/home/paydubbo/etc/config.properties
</value>
</list>
</property>
</bean>
<!-- 属性参数加密码配置 -->
<bean id="propertyConfig" class="com.imobpay.base.config.PropertyPlaceholderConfigurerExt">
<property name="locations">
<list>
<value>File:/home/paydubbo/etc/config.properties
</value>
</list>
</property>
</bean>
<!-- 对态加载注解 -->
<context:component-scan annotation-config="true" base-package="com.imobpay.base.*" />
<!-- 采用注释的方式配置bean -->
<context:annotation-config />
<!-- 定义执行定时任务的线程池 executor表示执行定时的线程数,scheduler表示定时任务的队列大小,这里最多是10个,这里的执行任务线程池使用的是taskExecutor-->
<task:annotation-driven executor="taskExecutor" scheduler="scheduler" />
<task:scheduler id="scheduler" pool-size="10" />
<!-- id:当配置多个executor时,被@Async("id")指定使用;也被作为线程名的前缀。 pool-size: core size:最小的线程数,缺省:1 max size:最大的线程数,缺省:Integer.MAX_VALUE queue-capacity:当最小的线程数已经被占用满后,新的任务会被放进queue里面,当这个queue的capacity也被占满之后,pool里面会创建新线程处理这个任务,直到总线程数达到了max
size,这时系统会拒绝这个任务并抛出TaskRejectedException异常(缺省配置的情况下,可以通过rejection-policy来决定如何处理这种情况)。缺省值为:Integer.MAX_VALUE keep-alive:超过core size的那些线程,任务完成后,再经过这个时长(秒)会被结束掉 rejection-policy:当pool已经达到max size的时候,如何处理新任务
ABORT(缺省):抛出TaskRejectedException异常,然后不执行 DISCARD:不执行,也不抛出异常 DISCARD_OLDEST:丢弃queue中最旧的那个任务 CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行 -->
<!-- <task:executor id="myexecutor" pool-size="10-50" queue-capacity="100" keep-alive="600" rejection-policy="CALLER_RUNS" /> -->
<!-- Spring线程池 Reject策略预定义有四种: (1)ThreadPoolExecutor.AbortPolicy策略,是默认的策略,处理程序遭到拒绝将抛出运行时 RejectedExecutionException。 (2)ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃. (3)ThreadPoolExecutor.DiscardPolicy策略,不能执行的任务将被丢弃.
(4)ThreadPoolExecutor.DiscardOldestPolicy策略,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程). -->
<!-- 实时短信和队列的线程池 -->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="${taskExecutor.corePoolSize}" />
<property name="maxPoolSize" value="${taskExecutor.maxPoolSize}" />
<property name="keepAliveSeconds" value="${taskExecutor.keepAliveSeconds}" />
<property name="queueCapacity" value="${taskExecutor.queueCapacity}" />
<property name="allowCoreThreadTimeOut" value="true"></property>
<!-- 线程池对拒绝任务(无线程可用)的处理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃. -->
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
</property>
</bean>
<!-- 批量短信和推送线程池 -->
<bean id="taskExecutorBatch" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="${taskExecutorBatch.corePoolSize}" />
<property name="maxPoolSize" value="${taskExecutorBatch.maxPoolSize}" />
<property name="keepAliveSeconds" value="${taskExecutorBatch.keepAliveSeconds}" />
<property name="queueCapacity" value="${taskExecutorBatch.queueCapacity}" />
<property name="allowCoreThreadTimeOut" value="true"></property>
<!-- 线程池对拒绝任务(无线程可用)的处理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃. -->
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
</property>
</bean>
<!-- 定时任务 -->
<bean id="timeJob" class="com.imobpay.base.services.impl.ServicesTimeJob"></bean>
<task:scheduled-tasks>
<!-- 每分钟打印一次线程池的信息 -->
<task:scheduled ref="timeJob" method="printlnThreadPoolInfo" cron="${task.printlnThreadPoolInfo}" />
</task:scheduled-tasks>
</beans>
spring可以使用@Async(“taskExecutor”)来执行异步操作
@Async(“taskExecutor”)里面的taskExecutor就是上面配置线程池的id
@Async("taskExecutor")
@Override
public void onMessage(Message message) {
//doSomething...........
}
记录下java里面线程池的书写
/**
* 设置清算机构初始化去线程池
*/
ThreadPoolExecutor settleTaskExecutor;
settleTaskExecutor = new ThreadPoolExecutor(settleList.size(), Runtime.getRuntime().availableProcessors() * settleList.size(), 200, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(300), new ThreadPoolExecutor.DiscardOldestPolicy());
settleTaskExecutor.allowCoreThreadTimeOut(true);