东北往事回忆录之我与@Async不得不说的那些事

作为辽北第一狠人的我 ,自然有几场代码的恶仗是我主打的

image.png

然而在接收企业微信的回调请求的时候,却碰到了问题。

企业微信回调要求必须在5秒以内给相应,可是那里的业务代码十分复杂,各个微服务之间有很多调用关系,5秒内有可能不会结束,而这时企业微信就会把请求重发,但是这个回调并不需要对应返回,所以自然而然的想到了使用异步方法调用,在让它保证我的方法能感知到企业微信的回调开始执行的同时,还可以直接返回一个固定的response。那我很自然的就把手伸向了Spring的@Async……

@Async:当时我害怕极了

好,不开玩笑了,先给大家介绍一下什么是异步调用:

异步调用是针对于同步的概念,代码可以不一个接一个的执行-返回 ,而是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。(就是多线程嘛)

在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。

直接一个@Async狠狠地拍在方法的上面就简单实现了异步调用,就像这样

但是其实我这个方法的返回并不会被调用的地方用到,因为没等这个异步方法走完呢,调用那里已经把请求返回给微信了,如果需要这个异步方法的返回值的话 就应该把返回值用Future<>包裹起来

ps:Future是一个接口,这个接口可以对runnable和callable类型的对象进行查询是否完成、取消、结束、获取结果

并且Spring实现一个它的子类:Async<> ,被@Async修饰的方法返回的时候直接用就行啦

调用者那里还可以根据isDone来判断这个异步方法的是否执行完成,通常的玩法是这样的

那么一定又有小朋友要问了,那你这个异步方法中出现了异常怎么办呢?异常会怎么抛出呢?

这也得分情况来说,如果是void方法,那就得写一个配置类,实现AsyncConfigurer然后override里面的getAsyncUncaughtException方法 然后再写一个Handler,在里面处理异常。

如果是有返回值的方法,就可以在调用处try catch了

这些暂时是够我用了,等这个迭代结束闲下来该好好的看看他的实现了。

参考的博客:

https://www.cnblogs.com/jpfss/p/10273129.html

https://cloud.tencent.com/developer/article/1511820

https://www.jianshu.com/p/11c78717799b

3 Comments

liyelin 6 3 月, 2020 Reply

忘了说了! 记得要在启动类上加上@EnableAsync !!!!

liyelin 26 5 月, 2020 Reply

https://github.com/alex2chen/feign-async 这个博客讲的很棒

download 22 12 月, 2020 Reply

Hello, I enjoy reading through your article post. I wanted to write a little comment to support you. Pietra Bartlet Gemperle

发表回复

蒙ICP备2022000577号-1