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){}
}
}
分享到:
相关推荐
`标签`中的“源码”提示我们可以深入研究Spring线程池的实现,例如分析`ThreadPoolTaskExecutor`的源代码,了解其内部如何处理任务提交、线程管理以及异常处理等。而“工具”则可能是指Spring提供的一些工具类或辅助...
- **拒绝策略(Rejected Execution Handler)**:当线程池和队列都满时,处理新任务的策略,常见的策略有抛出异常、忽略任务、调用系统守护线程或自定义处理。 2. **线程池的创建与使用**: 使用`Executors`工厂...
* maxPoolSize:如果 queueCapacity 存满了,还有任务就会启动更多的线程,直到线程数达到 maxPoolSize。 * rejectedExecutionHandler:拒绝策略,用于处理超过 maxPoolSize 的任务。有多种策略可供选择,例如: 1....
当队列也满了,如果再有新任务,且当前运行的线程数未达到最大值,会创建新的线程来处理任务。 `getAsyncExecutor()`方法返回的Executor实例就是用来执行异步任务的。而`getAsyncUncaughtExceptionHandler()`方法...
4. 当线程数达到最大值且任务队列已满,新提交的任务会被拒绝,此时可以设置一个`RejectedExecutionHandler`来处理这种情况,例如丢弃任务或抛出异常。 在实际应用中,我们可能还需要关注线程池的监控和调优,例如...
当工作队列满时,如果当前线程数小于最大线程数,会创建新的线程来处理任务。 3. **工作队列**:也称为任务队列,用于存储等待执行的任务。当线程数达到最大值时,新任务会放入队列中等待。 4. **拒绝策略**:当工作...