作为辽北第一狠人的我 ,自然有几场代码的恶仗是我主打的
然而在接收企业微信的回调请求的时候,却碰到了问题。
企业微信回调要求必须在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
3 Comments
忘了说了! 记得要在启动类上加上@EnableAsync !!!!
https://github.com/alex2chen/feign-async 这个博客讲的很棒
Hello, I enjoy reading through your article post. I wanted to write a little comment to support you. Pietra Bartlet Gemperle