Spring配置异步任务处理

前言:

    在项目开发中,我们经常会有异步调用任务的需求,比如:

        a.在与第三方系统数据交互时,需要另开一个线程去执行交互任务

        b.系统中日志记录不希望引起响应迟缓

        c.短信、发送邮件等

web.xml 3.0才开始支持异步,Spring3.2以上版本中提供了@async注解帮助我们更好的处理类似问题,以免引起阻塞导致请求响应不及时

 

相关配置及说明:

注意:

    a.配置文件中一定不要重复扫描使用@async注解的方法类的包,有重复扫描会导致@async注解失效,后者扫描会导致前者的异步代理失效

    b.Spring的异步是作用于方法上,也就是@async是标注在方法上的

 

首先*.servlet.xml文件引入命名空间配置:

xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task 
http://www.springframework.org/schema/task/spring-task.xsd

xml启用配置方式:

<task:executor id="asynExecutor" pool-size="10-1000" queue-capacity="10" keep-alive="10" rejection-policy="CALLER_RUNS"/>  
<task:annotation-driven executor="asynExecutor"/>

配置意思:线程池中最小线程数为10,最大数为1000, 队列的capacity数为10,任务完成后,线程池中保留最小线程数10,超出的在10s内未使用将被结束掉,当使用的线程数超出线程池最大线程数且队列也已满时由调用者所在线程来执行相应任务

 


配置属性 描述pool-sizecore size:最小的线程数,缺省:1
max size:最大的线程数,缺省:Integer.MAX_VALUEqueue-capacity当线程池中最小的线程数被占用满后,新的任务会被放进队列queue里面,当这个queue的capacity也被占满之后,pool里面会创建新线程处理这个任务,直到总线程数达到了最大线程数maxsize,这时系统会拒绝这个任务并抛出TaskRejectedException异常(缺省配置的情况下,可以通过rejection-policy来决定如何处理这种情况)。缺省值为:Integer.MAX_VALUEkeep-alive超过coresize最小线程数的那些线程,任务完成后,再经过这个设置的时长(单位:秒)会被结束掉,这样的话线程池可以动态的调整池中的线程数rejection-policyABORT(缺省):抛出TaskRejectedException异常,然后不执行
DISCARD:不执行,也不抛出异常即放弃该线程
DISCARD_OLDEST:丢弃queue中最旧的那个任务
CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行(不再异步)

@async使用注意事项:

    @Async注解的方法中将无法产生事务管理的控制。如果想使用有@async注解的方法去调用加有@Transactional注解的含有数据操作的方法达到事务控制目的,你需要用不同的类的方法来使用注释@async或@Transactional,也就是说@Async和@Transactional对同一个类中的方法不会同时有效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值