记录下spring使用线程池的配置

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);

猜你喜欢

转载自blog.csdn.net/u010316188/article/details/80702027