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

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异步调用@Async过程详解

    主要介绍了Spring Boot异步调用@Async过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

    主要给大家介绍了关于Spring Boot利用@Async异步调用:使用Future及定义超时的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友可以参考下

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

    本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

    Spring为任务调度与异步方法执行提供了注解支持。通过在方法上设置@Async注解,可使得方法被异步调用。下面这篇文章主要给大家介绍了关于spring boot异步调用方式@Async的相关资料,需要的朋友可以参考下。

    spring boot 全面的样例代码

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

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

    本篇文章主要介绍了spring boot 使用@Async实现异步调用方法,具有一定的参考价值,有兴趣的可以了解一下。

    springboot学习

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

    Spring Boot利用@Async异步调用:ThreadPoolTaskScheduler线程池的优雅关闭详解

    主要给大家介绍了关于Spring Boot利用@Async异步调用:ThreadPoolTaskScheduler线程池的优雅关闭的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧

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

    在项目中,当访问其他人的接口较慢或者做耗时任务时,不想程序一直卡在耗时任务上,想程序能够并行执行,我们可以使用多线程来并行的处理任务,也可以使用spring提供的异步处理方式@Async。需要的朋友们下面来一起看...

    spring-async:具有DeferredResult的异步REST调用

    Spring中的异步REST结果 大部分Spring Boot REST教程都应从基础知识入手。 但是,当您开始在生产中使用Spring Boot时,您很快就会发现,按照字母中的示例操作可能会导致性能问题。 在本文中,我将向您展示如何利用...

    Spring Boot教程程序样例

    包括快速入门、工程配置、Web开发、数据访问、事务管理、@Scheduled创建定时任务、@Async实现异步调用、日志管理、安全管理、缓存支持、邮件发送、消息服务、Dubbo进行服务治理等

    spring boot异步(Async)任务调度实现方法

    在没有使用spring boot之前,我们的做法是在配置文件中定义一个任务池,然后将@Async注解的任务丢到任务池中去执行,那么在spring boot中,怎么来实现异步任务的调用了,下面通过本文给大家讲解,需要的朋友参考下

    Java多线程之定时任务 以及 SpringBoot多线程实现定时任务——异步任务

    1. SpringBoot 自定义线程池以及多线程间的异步调用(@Async、@EnableAsync) 2.Java多线程之定时任务 以及 SpringBoot多线程实现定时任务 3.@EnableScheduling 与 @Scheduled

    淘宝放单源码Java-agan-boot:gan-boot

    淘宝放单源码Java ... 案例实战:SpringBoot异步调用 案例实战:为@Async实现一个自定义线程池 04 用swagger为SpringBoot生成接口文档 为什么要用swagger,它解决了什么问题? 案例实战:把springb

    java收银系统源码-epay-web:springboot,mybatis-plus项目~epay个人免签收款支付系统,完全免费,资金直接到

    java收银系统 源码 ePay个人收款支付系统 ...无需备案,无需签约,无需挂机监控APP,无需插件,无需第三方支付SDK,无需营业执照身份证,只需收款码,搞定支付流程 ...异步调用 @Scheduled 定时任务 JavaMailSender发送模

    SpringBoot新手学习手册

    文档内容 ...12.2、使用@Async实现异步调用 47 12.3、自定义参数 49 12.4、多环境配置 50 12.5、修改端口号 50 12.6、SpringBoot yml 使用 50 12.7、SpringBoot整合拦截器 51 12.8、发布打包 52

    fat:基于springboot,zookeeper,redis分布式事务强一致性方案

    脂肪FAT,基于springboot,使用zookeeper,redis,spring异步,spring transactionManager的强一致性分布式事务解决方案框架介绍纯编码方式,强一致性。使用redis / zookeeper作为注册中心,代理事务的执行,使用...

Global site tag (gtag.js) - Google Analytics