在观察线上系统的运行情况下,发现在错误日志中有这类错误信息,org.springframework.core.task.TaskRejectedException,于是便对ThreadPoolTaskExecutor类做下梳理.
1.ThreadPoolExecutor
Spring中的ThreadPoolTaskExecutor是借助于JDK并发包中的java.util.concurrent.ThreadPoolExecutor来实现的.下面先学习下ThreadPoolExecutor中的相关信息.ThreadPoolExecutor构造函数如下:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
}
下面分别说下各项代表的具体意义:
int corePoolSize:线程池维护线程的最小数量.
int maximumPoolSize:线程池维护线程的最大数量.
long keepAliveTime:空闲线程的存活时间.
TimeUnit unit: 时间单位,现有纳秒,微秒,毫秒,秒枚举值.
BlockingQueue<Runnable> workQueue:持有等待执行的任务队列.
RejectedExecutionHandler handler:
用来拒绝一个任务的执行,有两种情况会发生这种情况。
一是在execute方法中若addIfUnderMaximumPoolSize(command)为false,即线程池已经饱和;
二是在execute方法中, 发现runState!=RUNNING || poolSize == 0,即已经shutdown,就调用ensureQueuedTaskHandled(Runnable command),在该方法中有可能调用reject。
Reject策略预定义有四种:
(1)ThreadPoolExecutor.AbortPolicy策略,是默认的策略,处理程序遭到拒绝将抛出运行时 RejectedExecutionException。
(2)ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃.
(3)ThreadPoolExecutor.DiscardPolicy策略,不能执行的任务将被丢弃.
(4)ThreadPoolExecutor.DiscardOldestPolicy策略,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程).
2. Spring中ThreadPoolTaskExecutor的使用
最常用方式就是做为BEAN注入到容器中,如下代码:
<bean id="threadPoolTaskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="15" />
<property name="queueCapacity" value="1000" />
</bean>
ThreadPoolExecutor执行器的处理流程:
(1)当线程池大小小于corePoolSize就新建线程,并处理请求.
(2)当线程池大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去从workQueue中取任务并处理.
(3)当workQueue放不下新入的任务时,新建线程加入线程池,并处理请求,如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理.
(4)另外,当线程池的线程数大于corePoolSize的时候,多余的线程会等待keepAliveTime长的时间,如果无请求可处理就自行销毁.
了解清楚了ThreadPoolExecutor的执行流程,开头提到的org.springframework.core.task.TaskRejectedException异常也就好理解和解决了.ThreadPoolTaskExecutor类中使用的
就是ThreadPoolExecutor.AbortPolicy()策略,直接抛出异常.
分享到:
相关推荐
ThreadPoolTaskExecutor的配置主要通过在Spring配置文件中定义一个名为taskExecutor的Bean来实现。下面是一个基本的配置示例: ```xml <bean id="taskExecutor" class="org.springframework.scheduling.concurrent....
在Spring框架中,线程池的使用是实现并发和异步任务执行的关键工具。线程池的概念源于Java的`java.util.concurrent.ExecutorService`接口,它允许我们管理一组可重用的工作线程,以提高系统效率并减少资源消耗。...
Spring的TaskExecutor接口和ThreadPoolTaskExecutor类可以方便地实现异步任务和定时任务,这对于后台服务的自动化和定时运行非常有用。而RMI(Remote Method Invocation)支持则使得Spring应用能够跨网络进行分布式...
在Spring的ThreadPoolTaskExecutor中,可以设置`errorHandler`属性来指定自定义的异常处理器。 此外,Spring的`@Async`注解也可以用来实现异步执行,但这与定时任务不同,它不涉及时间间隔,而是立即启动一个新的...
9. **任务调度**:Spring的Task模块提供了异步任务和定时任务的支持,包括SimpleAsyncTaskExecutor、ThreadPoolTaskExecutor以及ScheduledTaskRegistrar等。 10. **RESTful支持**:Spring MVC的Controller可以通过@...
Spring 中 @Async 注解的使用 @Async 注解是 Spring 框架提供的一种异步执行方法的实现方式,从 Spring 3.0 版本开始提供。使用 @Async 注解可以将方法标识为异步方法,通过 SimpleAsyncTaskExecutor 执行,但不...
Spring的`ThreadPoolTaskExecutor`或`ConcurrentTaskExecutor`可以作为Quartz的执行器,以利用Spring的线程池管理功能。 总的来说,这个压缩包可能包含了一个完整的Spring项目,该项目演示了如何在Spring应用中配置...
3. **TaskExecutor**:Spring Batch支持多种类型的`TaskExecutor`,如SimpleAsyncTaskExecutor(基于线程池的异步执行)或ThreadPoolTaskExecutor(自定义线程池),用于并行执行子任务。 4. **Step实现**:每个...
- 为了性能考虑,可以使用Spring的`ThreadPoolTaskExecutor`进行SQL批处理。 - 使用Spring的`@Scope("prototype")`注解避免单例模式下Mapper接口的线程安全问题。 总的来说,Spring3和MyBatis3的集成使得开发者...
在Spring中,你可以通过配置`ThreadPoolTaskExecutor`或`SimpleAsyncTaskExecutor`来实现异步任务的执行。 2. **Spring TaskScheduler**: `TaskScheduler`接口是Spring提供的另一个核心组件,用于计划周期性的任务...
<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> ``` 然后,可以在需要发起HTTP请求的业务逻辑中注入这个线程池,异步执行任务: ```...
在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 一、Spring MVC与并发处理 1. Spring MVC通过DispatcherServlet接收HTTP请求,然后根据映射规则将...
在Spring框架中,异步调用是一种提升应用性能和响应速度的重要技术。它允许你在不阻塞当前线程的情况下执行耗时的操作,从而提高系统的并发处理能力。本示例将探讨如何在Spring中实现异步调用,并通过具体的例子帮助...
在Spring Boot应用中,事务管理和多线程是两个非常关键的特性,特别是在处理复杂的业务逻辑时。本示例将深入探讨如何使用注解来实现事务控制以及如何在Spring Boot中运用多线程。 首先,让我们关注"注解事务"。在...
在Spring中,我们通常使用`ThreadPoolTaskExecutor`来创建一个线程池,它是一个实现了`java.util.concurrent.Executor`接口的Spring组件。线程池可以有效管理线程资源,避免频繁创建和销毁线程带来的开销。通过配置...
在Java编程中,Spring框架是企业级应用开发的首选,它提供了一整套服务和支持,包括依赖注入、AOP(面向切面编程)、事务管理等。当我们谈到在Spring中实现多线程,实际上是在讨论如何在Spring环境中创建、管理和...
在Spring框架2.5版本中,提供了强大的定时任务管理功能,支持多种方式来实现定时任务的调度与执行。这为开发人员提供了一个灵活且易于集成的解决方案,使得应用程序能够按照预定的时间间隔或特定时间点执行某些任务...
为了在Spring中使用`ThreadPoolTaskExecutor`,我们需要在配置类中声明一个bean,如下所示: ```java @Configuration public class ThreadPoolConfig { @Bean(name = "threadPoolTaskExecutor") public ...
本资料“Spring实现任务调度”将深入探讨如何在Spring中设置和管理定时任务。 首先,我们需要理解Spring中的任务调度机制。Spring通过其`Task`模块提供了任务调度的功能,主要由两个核心组件构成:`TaskExecutor`和...
在【描述】中提到的"一个简单的spring的多线程demo",我们可以理解为一个示例项目,旨在帮助开发者理解如何在Spring中实现和管理多线程。 在Java中,多线程主要用于提高应用程序的执行效率,尤其是在处理I/O密集型...