Spring ThreadPoolTaskExecutor队列满的异常处理
2015-12-22 16:13
549 查看
<!-- 配置线程池 -->
<bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="keepAliveSeconds" value="30000" />
<property name="maxPoolSize" value="50" />
<property name="queueCapacity" value="100" />
</bean>
corePoolSize:默认开启线程数;maxPoolSize:最大线程数;queueCapacity:缓冲任务队列的长度;
创建线程的方式:
@Autowired
private ThreadPoolTaskExecutor threadPool;
threadPoolTaskExecutor.execute(new Runnable() {
public void run() {
//异步任务
}
});
Spring ThreadPoolTaskExecutor没有使用阻塞模式将任务加入到对象中,因此对象满的时候会抛出异常,对于这种情况,一般的企业执行环境不能无限制的增大内存队列容量,因此不得不阻塞队列的加入,spring内置提供的异常处理机制不好用,因为ThreadPoolExecutor.CallerRunsPolicy的处理方式是将异常任务放在调用线程中执行,这样对于单个执行时间长的任务,即使队列有空闲了,剩下的任务也要等这个任务在主线程执行完了才能继续往队列里面添加。有一个处理方法就是捕获executor.execute()的异常,只要发现有异常就等待一段时间,直到没有异常为止,这样就能模仿阻塞队列的效果,下面是代码:
while(true){
try{
taskExecutor.execute(new MailSender(tUserIssueInfo));
break;
}catch(TaskRejectedException e){
try{
Thread.sleep(1000);
}catch(Exception e2){}
}
}
<bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="keepAliveSeconds" value="30000" />
<property name="maxPoolSize" value="50" />
<property name="queueCapacity" value="100" />
</bean>
corePoolSize:默认开启线程数;maxPoolSize:最大线程数;queueCapacity:缓冲任务队列的长度;
创建线程的方式:
@Autowired
private ThreadPoolTaskExecutor threadPool;
threadPoolTaskExecutor.execute(new Runnable() {
public void run() {
//异步任务
}
});
Spring ThreadPoolTaskExecutor没有使用阻塞模式将任务加入到对象中,因此对象满的时候会抛出异常,对于这种情况,一般的企业执行环境不能无限制的增大内存队列容量,因此不得不阻塞队列的加入,spring内置提供的异常处理机制不好用,因为ThreadPoolExecutor.CallerRunsPolicy的处理方式是将异常任务放在调用线程中执行,这样对于单个执行时间长的任务,即使队列有空闲了,剩下的任务也要等这个任务在主线程执行完了才能继续往队列里面添加。有一个处理方法就是捕获executor.execute()的异常,只要发现有异常就等待一段时间,直到没有异常为止,这样就能模仿阻塞队列的效果,下面是代码:
while(true){
try{
taskExecutor.execute(new MailSender(tUserIssueInfo));
break;
}catch(TaskRejectedException e){
try{
Thread.sleep(1000);
}catch(Exception e2){}
}
}
相关文章推荐
- eclipse maven项目变为web项目
- spring security异常
- java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
- 关于java集合的遍历以及ConcurrentModificationException(并发操作异常)
- JAVA RMI远程方法调用简单实例
- SpringMVC入门实例及详细讲解
- Eclipse添加和查看书签
- GeoHash核心原理解析及java代码实现(转)
- spring security(转载)
- ListView性能优化之convertView和ViewHolder
- Java VisualVM使用手册
- javadoc生成开发文档
- 解决 jsp eclipse异常 【The import javax.servlet cannot be resolved】
- java获取两个日期间的月份集合
- Java socket通讯(一)
- LayoutInflater 用法
- TestNG入门教程(TestNG介绍、在Eclipse中安装TESTNG、测试小例子、基本注解、如何执行测试、按顺序执行Case、异常测试、组合测试、参数化测试、忽略测试、依赖测试、测试结果报告)
- 轻量级JavaEE企业应用实战(十四)
- spring事务传播
- Java初学习 - 线程同步的一点说明