`
rensanning
  • 浏览: 3547961 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38135
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607262
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682257
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89320
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:401815
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69685
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91692
社区版块
存档分类
最新评论

Spring Boot 入门 - 进阶篇(2)- 异步调用(@Async)

 
阅读更多
异步处理
  • Java的异步处理Thread/Runnable、Callable/Future
  • Servlet 2.5的异步处理 Tomcat的CometProcessor、Jetty的Continuations
  • Servlet 3.0的异步处理 asyncSupported、AsyncContext
  • Spring MVC的异步处理 @Async、AsyncTaskExecutor
  • Spring MVC的SSE ResponseBodyEmitter、SseEmitter、StreamingResponseBody


Spring Boot本身对异步调用没有多大的变动,基本还是Spring MVC的@Async。

(1)开启Spring的异步支持
@Configuration
@EnableAsync
public class SpringAsyncConfig { 

}


开启@EnableWebMvc的时候也自动开启了异步处理,但在Spring Boot项目中是不能使用@EnableWebMvc的。它会使Spring Boot的AutoConfigure一部分功能失效。
官方文档里有说明:
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-spring-mvc-auto-configuration

@EnableWebMvc
@ComponentScan("com.example.component")
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        configurer.setTaskExecutor(mvcAsyncExecutor());
    }

    @Bean
    public AsyncTaskExecutor mvcAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(10);
        return executor;
    }
}



(2)定义需要执行异步处理的方法

1)没有返回值
@Async
public void asyncMethodWithVoidReturnType() {
    System.out.println("Execute method asynchronously. "
      + Thread.currentThread().getName());
}

2)带返回值
@Async
public Future<String> asyncMethodWithReturnType() {
    System.out.println("Execute method asynchronously - "
      + Thread.currentThread().getName());
    try {
        Thread.sleep(5000);
        return new AsyncResult<String>("hello world !");
    } catch (InterruptedException e) {
    }
 
    return null;
}


(3)异步线程池的定义

1)一个线程池

@Configuration
@EnableAsync
public class SpringAsyncConfig {
    @Bean
    public AsyncTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(10);
        return executor;
    }
}


2)多个线程池

@Configuration
@EnableAsync
public class SpringAsyncConfig {
     
    @Bean(name = "threadPoolTaskExecutor1")
    public Executor threadPoolTaskExecutor() {
        return new ThreadPoolTaskExecutor();
    }
     
    @Bean(name = "threadPoolTaskExecutor2")
    public Executor threadPoolTaskExecutor() {
        return new ThreadPoolTaskExecutor();
    }

}


@Async("threadPoolTaskExecutor1")
public void asyncMethodWithConfiguredExecutor() {
    System.out.println("Execute method with configured executor - "
      + Thread.currentThread().getName());
}


(4)异步异常的处理

public interface AsyncConfigurer {
    Executor getAsyncExecutor();
    AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler();
}


AsyncConfigurerSupport是AsyncConfigurer接口的实现但里边什么也没做。
@Configuration
@EnableAsync
class SpringAsyncConfigurer extends AsyncConfigurerSupport {

    @Bean
    public ThreadPoolTaskExecutor asyncExecutor() {
        ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
        threadPool.setCorePoolSize(3);
        threadPool.setMaxPoolSize(3);
        threadPool.setWaitForTasksToCompleteOnShutdown(true);
        threadPool.setAwaitTerminationSeconds(60 * 15);
        return threadPool;
    }

    @Override
    public Executor getAsyncExecutor() {
        return asyncExecutor;
    }
}


可以自己实现AsyncConfigurer接口处理异常。
@Configuration
@EnableAsync
public class SpringAsyncConfigurer implements AsyncConfigurer {
     
    @Override
    public Executor getAsyncExecutor() {
        return new ThreadPoolTaskExecutor();
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new CustomAsyncExceptionHandler();
    }

}

public class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
 
    @Override
    public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
        System.out.println("Exception message - " + throwable.getMessage());
        System.out.println("Method name - " + method.getName());
        for (Object param : obj) {
            System.out.println("Parameter value - " + param);
        }
    }
     
}


参考:
http://qiita.com/kazuki43zoo/items/8be79f98621f90865b78
http://qiita.com/kazuki43zoo/items/ce88dea403c596249e8a
http://qiita.com/kazuki43zoo/items/53b79fe91c41cc5c2e59
分享到:
评论

相关推荐

    Spring Boot利用@Async如何实现异步调用:自定义线程池

    Spring Boot利用@Async实现异步调用:自定义线程池 Spring Boot是一个流行的Java框架,它提供了许多实用的特性来简化应用程序的开发。其中,异步调用是Spring Boot中的一个重要特性,它允许开发者将一些耗时的任务...

    spring-boot-async-test.zip

    在给定的"spring-boot-async-test.zip"压缩包中,包含了一个示例,演示了两种不同类型的异步请求:一种是没有返回值的异步请求,另一种是有返回值的异步请求。 首先,让我们详细了解一下Spring Boot中的异步处理...

    Spring Boot异步调用@Async过程详解

    Spring Boot 异步调用 @Async 过程详解 Spring Boot 异步调用 @Async 过程详解是 Spring Boot 框架中的一种异步调用机制,通过使用 @Async 注解可以将方法异步执行,提高系统的并发性和响应速度。本文将详细介绍 ...

    spring-boot-multithreading.zip_spring boot_多线程

    在Spring Boot应用中,多线程的使用是一个关键特性,特别是在处理高并发或者需要执行耗时操作时。本文将深入探讨Spring Boot如何实现多线程,并结合提供的`spring-boot-multithreading.zip`压缩包中的示例进行讲解。...

    springboot中@Async异步调用注解的使用

    在Spring Boot框架中,@Async注解是实现异步任务处理的关键工具,它允许开发者将耗时的操作从主线程中分离出来,以提高应用程序的响应速度。本文将深入探讨@Async的工作原理、配置方法以及使用场景,帮助你更好地...

    spring boot中使用@Async实现异步调用任务

    在Spring Boot中,异步调用是通过Spring的`@Async`注解来实现的,它允许我们在不阻塞主线程的情况下执行耗时的操作。这极大地提高了应用的响应速度,尤其是在处理大量并发请求时。接下来,我们将深入探讨如何在...

    spring-dubbo-spring-boot.rar_java编程_spring_spring boot_threwwab_

    在Spring Boot中,可以利用`@Async`注解实现异步调用,提高系统性能。但需要注意,Dubbo本身并不支持异步调用,如果需要在Spring Boot中实现异步调用Dubbo服务,通常需要自定义拦截器或采用消息中间件等方式进行改造...

    Springboot启用async异步调用

    在Spring Boot中,启用`async`异步调用是一项关键功能,它允许应用程序在处理请求时启动一个后台任务,而不必等待该任务完成。这在处理耗时操作时尤其有用,如大数据计算、发送电子邮件或文件上传等。下面将详细阐述...

    spring boot 使用@Async实现异步调用方法

    下面将详细解释如何在Spring Boot中使用`@Async`实现异步调用,以及其背后的原理。 首先,要启用`@Async`注解的功能,需要在Spring Boot的主配置类上添加`@EnableAsync`注解。这会告诉Spring框架,你需要异步任务的...

    Spring Boot利用@Async异步调用:使用Future及定义超时详解

    在Spring Boot应用中,我们可以利用`@Async`注解实现异步调用,这有助于提高应用程序的并发性能,尤其在处理耗时操作时。本文将详细介绍如何使用`@Async`结合`Future`来处理异步任务,并探讨如何定义超时。 `@Async...

    spring boot 全面的样例代码

    - chapter4-1-2:[使用@Async实现异步调用](http://blog.didispace.com/springbootasync/) #### 日志管理 - chapter4-2-1:[默认日志的配置](http://blog.didispace.com/springbootlog/) - chapter4-2-2:[使用log...

    springboot学习

    chapter4-1-2:使用@Async实现异步调用 chapter4-1-3:使用@Async实现异步调用:自定义线程池 chapter4-1-4:使用@Async实现异步调用:资源优雅关闭 chapter4-1-5:使用@Async实现异步调用:使用Future以及定义超时 ...

    深入理解spring boot异步调用方式@Async

    在Spring Boot应用中,`@Async`注解用于实现异步方法执行,这极大地提高了应用程序的并发性能。本文将深入探讨`@Async`的工作原理、使用场景以及如何配置和测试。 1. **异步注解的启用** 使用`@EnableAsync`注解在...

    Spring Boot集成教程之异步调用Async

    总结起来,Spring Boot的异步调用功能通过`@Async`注解提供了一种简单且高效的方式来并行执行任务,避免了因为单一耗时操作导致的阻塞。它利用了Spring的并发支持,如线程池,使得开发者无需直接处理多线程的复杂性...

    Spring Boot @Async 异步任务执行方法

    Spring Boot 框架提供了 @Async 注解来支持异步任务执行,该注解可以将方法调用转换为异步调用,从而提高应用程序的并发能力和响应速度。下面是关于 Spring Boot @Async 异步任务执行方法的详细知识点: 1. ...

    【java框架】SpringBoot(10) -- SpringBoot巧用 @Async提升API接口并发能力 .pdf

    在高并发的Web应用中,提高接口的并发处理能力是至关重要的,而SpringBoot框架提供了一种简单有效的方法——使用`@Async`注解来实现异步调用,从而优化性能。本文将深入探讨什么是异步调用,以及如何在SpringBoot中...

    spring boot web demo

    11. 异步处理:Spring Boot支持异步方法调用,通过`@Async`注解,可以在后台线程中执行耗时操作,提高应用性能。 12. 安全管理:Spring Security是Spring Boot默认的安全框架,提供身份验证和授权功能。通过简单的...

    springboot整合es-springboot-elasticsearch.zip

    - 使用`@Async`进行异步操作,提高性能 通过以上步骤和高级特性,你可以有效地将SpringBoot应用与Elasticsearch整合,实现高效的数据管理和搜索功能。"springboot-elasticsearch-master"项目中的源代码应该包含了...

    Spring Boot教程程序样例

    7. **@Async 实现异步调用**:使用`@Async`注解,开发者可以创建异步方法,提高应用程序的并发性能。这对于长时间运行的任务尤其有用,因为它不会阻塞主线程。 8. **日志管理**:Spring Boot 默认集成了Logback或...

    SpringBoot项目异步调用

    在Spring Boot项目中,异步调用是一种提升应用性能的关键技术。它允许应用程序在执行一个耗时操作(如数据库查询、文件处理等)时,不阻塞主线程,从而提高系统的响应速度和并发能力。Spring Boot提供了简单易用的...

Global site tag (gtag.js) - Google Analytics