概念

官网地址:​​http://dubbo.apache.org/zh/docs/v2.7/user/examples/async-call/​

异步调用就是利用了Java的多线程异步调用类

代码地址

​https://gitee.com/zjj19941/ZJJ_Dubbo.git​​​ 下的 ​​async-call​​​ 就是异步调用的代码demo案例

代码演示

interface项目

返回值是CompletableFuture

package com.zjj;


import java.util.concurrent.CompletableFuture;

public interface DemoService {

// 异步调用方法
CompletableFuture<String> sayHelloAsync(String name) ;

}

provider项目

实现interface的接口,在方法内部使用CompletableFuture异步处理

package com.zjj.provider.service;

import com.zjj.DemoService;
import org.apache.dubbo.config.annotation.Service;

import java.util.concurrent.CompletableFuture;

@Service(version = "default")
public class DefaultDemoService implements DemoService {

@Override
public CompletableFuture<String> sayHelloAsync(String name) {
System.out.println("执行了异步服务,参数 : " + name);

return CompletableFuture.supplyAsync(() -> {

return "异步执行完了"; // 正常访问
});
}

}

consumer项目

package com.zjj;

import org.apache.dubbo.config.annotation.Reference;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.concurrent.CompletableFuture;

@SpringBootApplication
public class DubboConsumerDemo {

//@Reference注解就是用于标记这个服务具体使用了生产者的哪个接口实现
@Reference(version = "default")
private DemoService demoService;

public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(DubboConsumerDemo.class);
DemoService demoService = context.getBean(DemoService.class);

// 调用直接返回CompletableFuture
CompletableFuture<String> future = demoService.sayHelloAsync("异步调用"); // 5

System.out.println("1.在执行别的业务逻辑......");

future.whenComplete((v, t) -> {
if (t != null) {
t.printStackTrace();
} else {
System.out.println("3.异步调用provider结果 : " + v);
}
});

System.out.println("2.结束了");

}

}

执行结果

消费者控制台:

1.在执行别的业务逻辑......
2.结束了
3.异步调用provider结果 : 异步执行完了

你会发现消费者那里并没有等CompletableFuture future = demoService.sayHelloAsync(“异步调用”);执行完,而是接着执行别的业务逻辑了,直到provider执行完了之后,返回了CompletableFuture,然后在whenComplete方法里面拿取到了结果

dubbo其它异步方式

参考别人的文章: ​​https://mp.weixin.qq.com/s/U3eyBUy6HBVy-xRw3LGbRQ​​ ​