首页 > 其他分享 >@Async配置与使用

@Async配置与使用

时间:2023-04-03 17:35:16浏览次数:42  
标签:异步 调用 返回值 配置 new 线程 使用 Async

应用场景

同步:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。

异步:异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。

例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕;如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了。

在Java中,一般在处理类似的场景之时,都是基于创建独立的线程去完成相应的异步调用逻辑,通过主线程和不同的业务子线程之间的执行流程,从而在启动独立的线程之后,主线程继续执行而不会产生停滞等待的情况。

Spring 已经实现的线程池

1、 SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,默认每次调用都会创建一个新的线程。
2、 SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作。只适用于不需要多线程的地方。
3、 ConcurrentTaskExecutor:Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类。
4、 SimpleThreadPoolTaskExecutor:是Quartz的SimpleThreadPool的类。线程池同时被quartz和非quartz使用,才需要使用此类。
5、 ThreadPoolTaskExecutor :最常使用,推荐。其实质是对java.util.concurrent.ThreadPoolExecutor的包装。

异步的方法

1、 最简单的异步调用,返回值为void
2、 带参数的异步调用,异步方法可以传入参数
3、 存在返回值,常调用返回Future

Spring中启用@Async

// 基于Java配置的启用方式:
@Configuration  
@EnableAsync  
public class ThreadPoolTaskConfig { ... }  
 
// Spring boot启用:
@EnableAsync
@EnableTransactionManagement
@SpringBootApplication
public class MyTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyTestApplication.class, args);
    }
}

@Async应用默认线程池

Spring应用默认的线程池,指在@Async注解在使用时,不指定线程池的名称。查看源码,@Async的默认线程池为SimpleAsyncTaskExecutor

使用默认线程问题:项目上对一些慢接口的优化,把很多接口加上了@Async,上线运行一段时间后,发现线程数量激增!!!

TaskExecutor implementation that fires up a new Thread for each task, executing it asynchronously.

每提交一个任务,就会创建一个线程,能不炸吗?

解决方法: @Async(value="taskExecutor"), value参数传入自定义的线程池。

在线程池应用中,参考阿里巴巴java开发规范

线程池不允许使用Executors去创建,不允许使用系统默认的线程池,推荐通过ThreadPoolExecutor的方式,这样的处理方式让开发的工程师更加明确线程池的运行规则,规避资源耗尽的风险。Executors各个方法的弊端:

new FixedThreadPool和new SingleThreadExecutor:主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。

@Async调用

无返回值调用

基于@Async无返回值调用,直接在使用类,使用方法(建议在使用方法)上,加上注解。若需要抛出异常,需手动new一个异常抛出。

/**
  * 带参数的异步调用 异步方法可以传入参数
  *  对于返回值是void,异常会被AsyncUncaughtExceptionHandler处理掉
  * @param s
  */
 @Async
 public void asyncInvokeWithException(String s) {
     log.info("asyncInvokeWithParameter, parementer={}", s);
     throw new IllegalArgumentException(s);
 }

有返回值Future调用

/**
 * 异常调用返回Future
 *  对于返回值是Future,不会被AsyncUncaughtExceptionHandler处理,需要我们在方法中捕获异常并处理
 *  或者在调用方在调用Futrue.get时捕获异常进行处理
 * 
 * @param i
 * @return
 */
@Async
public Future<String> asyncInvokeReturnFuture(int i) {
    log.info("asyncInvokeReturnFuture, parementer={}", i);
    Future<String> future;
    try {
        Thread.sleep(1000 * 1);
        future = new AsyncResult<String>("success:" + i);
        throw new IllegalArgumentException("a");
    } catch (InterruptedException e) {
        future = new AsyncResult<String>("error");
    } catch(IllegalArgumentException e){
        future = new AsyncResult<String>("error-IllegalArgumentException");
    }
    return future;
}

原文章地址:
https://blog.csdn.net/yuechuzhixing/article/details/124775218

标签:异步,调用,返回值,配置,new,线程,使用,Async
From: https://www.cnblogs.com/1399z3blog/p/17283681.html

相关文章

  • linux使用php动态安装模块mysqli.so(ext/mysqlnd/mysqlnd.h: 没有那个文件或目录)
     由于我先安装的php,再安装的mysql!正常过程: 1、安装mysql 2、安装phpconfigure时带–with-mysql参数现在我不想重装,因此使用phpize动态安装mysqli,php版本为php-7.2.13 1先查看php下phpize路径  得知路劲为/usr/local/php/bin/phpize2切换到php源码包目录php-7......
  • Flask 和pythonweb框架介绍、flask快速使用、登录,显示用户信息小案例、配置文件方式、
    Flask和pythonweb框架介绍、flask快速使用、登录,显示用户信息小案例、配置文件方式、路由系统Flask和pythonweb框架介绍Flask和pythonweb框架的区别:Django框架: 大而全,内置的app很多,第三方的app很多Flask框架: 小而精,没有过多的内置app,只能完成web框架的基本功能,很多功能......
  • 使用Newtonsoft.Json在Net6中设置时间格式(含T/不含T)
    实例一:JsonSerializerSettingsjsonSettings=newJsonSerializerSettings{DateFormatString="yyyy-MM-ddHH:mm:ss.fff",};Modelmodel=newModel{CreatedAt=DateTime.UtcNow};......
  • VMware ESXi使用
    二、安全配置2.1建立防火墙规则选择网络->防火墙规则,限制外部对管理平台的访问。选择vSphereWebAccess,入站端口是80,点击编辑设置,选择仅允许以下网络连接,在里面填写允许的IP地址进行访问。选择vSphereWebClient,入站端口是443、902,点击编辑设置,选择仅允许以下网络连接,在里......
  • Apache JMeter压力测试工具的安装与使用
    官网下载https://jmeter.apache.org/download_jmeter.cgi然后解压即可运行双击bin/jmeter.bat汉化在软件里选择语言重启就会还原,所以这里直接改配置文件来永久汉化打开bin/jmeter.properties找到#language行,大概在第39行,改成language=zh_CN保存后重启jmeter即可使用教......
  • 19c 和11g临时表空间使用率
    19c临时表空间使用率(实际正在使用的)selecttotal_extents,free_extents,used_extents,added_extentsfromv$sort_segment;  selectcasewhenexists(select*fromv$tempseg_usage)thenround((selectsum(a.blocks)*8192/sum(b.bytes)fromv$tempseg_usagea,dba_tem......
  • CentOS7 安装git 配置秘钥公钥克隆代码
    第一步:安装git客户端,默认安装在/usr/libexec/git-core目录yum-yinstallgit#查看版本git--version第二步:配置git信息gitconfig--globaluser.name"username"gitconfig--globaluser.email"[email protected]"第三步:生成密钥和公钥,后续只需要按回车即可ssh-keygen-......
  • 在react中使用wangEditorV5
    wangEditor是基于JavaScript和css的一款web富文本编辑器,是国内比较好用的一款轻量级富文本编辑器,上手简单,易用且开源免费.官方文档:http://www.wangeditor.com/本文讲述的是在react中如何去使用这款富文本编辑器首先引入编辑器yarnadd@wangeditor/editor-for-reactnpmi......
  • 如何使用HTTPS加密保护网站?
    加密Web内容并不是什么新鲜事:自发布通过SSL/TLS协议来加密Web内容的规范以来,已经过去了近20年。然而,近年来,运行安全的HTTPS加密Web服务器已经从一种选择变成了一种安全防护的必需品。攻击者继续寻找并找到窃取用户和Web服务之间发送的信息的方法,通常是通过利用通过超文本......
  • xcode4.2中使用xib来运行hello world (MainWindow.xib)
    xcode4.2推荐使用storyboard,但网上资料太少,书上讲的也都是基于xib的 花了2天时间,终于把xib的helloWorld写出来了。 注意,类名一定要大写,为了这个东西,我搞了2天,在配viewContorller时一直抛错。 新建EmptyApplication 添加一个object,添加一个ViewController,添加一个window,把Fi......