`
yaozhiqiang109
  • 浏览: 119687 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring 异步TaskExecutor

阅读更多

Spring  org.springframework.core.task.TaskExecutor
        org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor

Spring的TaskExecutor接口等同于java.util.concurrent.Executor接口。 实际上,它存在的主要原因是为了在使用线程池的时候,将对Java 5的依赖抽象出来。 这个接口只有一个方法execute(Runnable task),它根据线程池的语义和配置,来接受一个执行任务。

 /**
	 * 异步调用
	 */
	private TaskExecutor taskExecutor;

	public TaskExecutor getTaskExecutor() {
		return taskExecutor;
	}

	public void setTaskExecutor(TaskExecutor taskExecutor) {
		this.taskExecutor = taskExecutor;
	}
	
	public void testTask(){
		taskExecutor.execute(new Runnable() {
			
			@Override
			public void run() {
				//业务逻辑
			}
		});
	}
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">        
    <!-- 核心线程数,默认为1 -->        
    <property name="corePoolSize" value="10" />        
    <!-- 最大线程数,默认为Integer.MAX_VALUE -->        
    <property name="maxPoolSize" value="50" />        
    <!-- 队列最大长度,一般需要设置值>=notifyScheduledMainExecutor.maxNum;默认为Integer.MAX_VALUE -->        
    <property name="queueCapacity" value="1000" />        
    <!-- 线程池维护线程所允许的空闲时间,默认为60s -->        
    <property name="keepAliveSeconds" value="300" />        
    <!-- 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者 -->        
    <property name="rejectedExecutionHandler">        
        <!-- AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常 -->        
        <!-- CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度 -->        
        <!-- DiscardOldestPolicy:抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->        
        <!-- DiscardPolicy:抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->        
        <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />        
    </property>        
</bean>  
 

在Spring发行包中预定义了一些TaskExecutor实现。有了它们,你甚至不需要再自行实现了。
SimpleAsyncTaskExecutor 类
这个实现不重用任何线程,或者说它每次调用都启动一个新线程。但是,它还是支持对并发总数设限,当超过线程并发总数限制时,阻塞新的调用,直到有位置被释放。如果你需要真正的池,请继续往下看。
SyncTaskExecutor类
这个实现不会异步执行。相反,每次调用都在发起调用的线程中执行。它的主要用处是在不需要多线程的时候,比如简单的test case。
ConcurrentTaskExecutor 类
这个实现是对Java 5 java.util.concurrent.Executor类的包装。有另一个备选, ThreadPoolTaskExecutor类,它暴露了Executor的配置参数作为bean属性。很少需要使用ConcurrentTaskExecutor, 但是如果ThreadPoolTaskExecutor不敷所需,ConcurrentTaskExecutor是另外一个备选。
SimpleThreadPoolTaskExecutor 类
这个实现实际上是Quartz的SimpleThreadPool类的子类,它会监听Spring的生命周期回调。当你有线程池,需要在Quartz和非Quartz组件中共用时,这是它的典型用处。
ThreadPoolTaskExecutor 类
它不支持任何对java.util.concurrent包的替换或者下行移植。Doug Lea和Dawid Kurzyniec对java.util.concurrent的实现都采用了不同的包结构,导致它们无法正确运行。
这个实现只能在Java 5环境中使用,但是却是这个环境中最常用的。它暴露的bean properties可以用来配置一个java.util.concurrent.ThreadPoolExecutor,把它包装到一个TaskExecutor中。如果你需要更加先进的类,比如ScheduledThreadPoolExecutor,我们建议你使用ConcurrentTaskExecutor来替代。
TimerTaskExecutor类
这个实现使用一个TimerTask作为其背后的实现。它和SyncTaskExecutor的不同在于,方法调用是在一个独立的线程中进行的,虽然在那个线程中是同步的。
WorkManagerTaskExecutor类
CommonJ 是BEA和IBM联合开发的一套规范。这些规范并非Java EE的标准,但它是BEA和IBM的应用服务器实现的共同标准
这个实现使用了CommonJ WorkManager作为其底层实现,是在Spring context中配置CommonJ WorkManager应用的最重要的类。和SimpleThreadPoolTaskExecutor类似,这个类实现了WorkManager接口,因此可以直接作为WorkManager使用。

 

4
1
分享到:
评论

相关推荐

    Spring 异步多线程动态任务处理的使用心得

    在现代应用中,高效地处理并发任务是至关重要的,Spring为此提供了异步任务处理的功能,可以显著提升系统的响应速度和性能。本文将深入探讨在Spring中如何利用多线程和动态任务来实现异步处理,并分享一些实践心得。...

    spring TaskExecutor.docx

    Spring的TaskExecutor是Java线程池抽象的一个重要组成部分,它为开发者提供了一种在Spring框架内使用线程池的方式,而无需直接依赖于特定的Java版本或Java EE环境中的线程池实现。TaskExecutor接口的设计使得在不同...

    征服 Kestrel + XMemcached + Spring TaskExecutor

    Spring TaskExecutor是Spring框架的一部分,提供了异步任务执行的能力。它允许开发者创建线程池,调度和管理后台任务。TaskExecutor接口提供了一种抽象,使得开发者无需关心底层的线程管理和并发细节,只需关注任务...

    Spring MVC异步模式

    在使用`@Async`之前,需要配置一个`TaskExecutor`,这是Spring用于执行异步任务的接口。Spring MVC默认提供了一个简单的`SimpleAsyncTaskExecutor`,但通常我们会选择更高效的实现,如`ThreadPoolTaskExecutor`。 ...

    spring线程池(同步、异步).docx

    一、Spring异步线程池类图 Spring提供了一系列的`TaskExecutor`实现,它们根据不同的需求和场景有不同的特性和行为。这些实现包括但不限于: 1. `SimpleAsyncTaskExecutor`:每次请求都会启动新的线程,不进行线程...

    Spring3.2异步处理http请求

    当一个方法被`@Async`标记后,Spring会使用配置的`TaskExecutor`来异步执行这个方法。 ```java @Service public class AsyncService { @Async public Future&lt;String&gt; longRunningTask() { // 长时间运行的任务 ...

    spring-task:Spring TaskExecutor演示

    Spring TaskExecutor是Spring框架中的一个核心组件,它提供了一种在后台执行任务的机制,使得开发者可以方便地异步处理任务,提高应用的性能和响应速度。本篇将深入探讨Spring TaskExecutor的基本概念、使用方法以及...

    Springboot启用async异步调用

    因此,我们可以通过配置自定义的`TaskExecutor`来调整异步任务的执行策略,例如使用线程池: ```java @Configuration @EnableAsync public class AppConfig implements AsyncConfigurer { @Override public ...

    浅谈Spring @Async异步线程池用法总结

    TaskExecutor是Spring异步线程池的接口类,定义了异步线程池的基本操作。SimpleAsyncTaskExecutor是一个简单的异步线程池, 每次调用都会创建一个新的线程。SyncTaskExecutor是一个同步操作,不适用于异步调用。...

    kestrel-task-executor:Kestrel + XMemcached + Spring TaskExecutor

    3. **Spring TaskExecutor**:Spring框架中的TaskExecutor接口提供了一种通用的方式来异步执行任务,无需关心线程管理细节。开发者可以通过配置TaskExecutor,比如使用ThreadPoolTaskExecutor或...

    Spring Boot 自定义异步线程池的两种方式Demo

    在Spring Boot应用中,我们经常需要处理大量的并发请求,这时自定义异步线程池就显得尤为重要。异步处理能够提高应用的响应速度,避免主线程阻塞,从而提升系统性能。本文将详细介绍两种在Spring Boot中实现自定义...

    Spring Async:实现异步调用示例.docx

    【Spring Async:实现异步调用示例】 在软件开发中,特别是在高并发场景下,异步调用是一个重要的优化手段。同步调用是传统的执行方式,它遵循线性顺序,每个方法调用必须等待前一个方法执行完毕才能继续。而异步...

    SpringBoot异步

    被注解的方法会由Spring的TaskExecutor执行,而不是由调用它的线程执行。 3. **配置异步处理** 在Spring Boot应用中,可以通过`@EnableAsync`注解开启异步支持,这通常放在配置类上。同时,可以使用`...

    mybatis-spring-1.0.1-bundle mybatis spring 官方下载

    结合 Spring 的 TaskExecutor,MyBatis-Spring 允许你以异步方式执行数据库操作。通过 `SqlSessionCallback` 或 `SqlSessionRunnable`,你可以编写回调代码来执行 SQL 查询,并在后台线程中运行。 7. **整合测试**...

    spring-async-mdc:在具有 Spring 的异步支持的池线程上填充 MDC 的示例

    3. **配置Spring Bean**:在Spring的配置文件中,我们需要将这个拦截器注册到`TaskExecutor`中,这样每次异步任务被提交时,都会调用该拦截器。 4. **测试和验证**:创建测试用例,确保在异步方法执行前后,MDC中的...

    spring定时任务关键jar包(齐全)

    `spring-context-support.jar`是Spring框架对Quartz和Commons JCR等第三方调度库的支持,同时也包含Spring自己的`TaskExecutor`和`TaskScheduler`接口,用于实现异步任务和定时任务。 1. **Spring TaskExecutor**: ...

    spring 2.0中文参考手册

    Spring的TaskExecutor接口和ThreadPoolTaskExecutor类可以方便地实现异步任务和定时任务,这对于后台服务的自动化和定时运行非常有用。而RMI(Remote Method Invocation)支持则使得Spring应用能够跨网络进行分布式...

    Spring基于线程池的定时任务线挰异常实践

    首先,我们需要了解Spring的TaskExecutor接口,这是Spring提供的用于异步执行任务的抽象。线程池的实现可以通过实现这个接口来完成,Spring提供了ThreadPoolTaskExecutor作为线程池的实现。通过配置...

Global site tag (gtag.js) - Google Analytics