参数回调方式与调用本地callback或listener相同,只要在Spring的配置文件中声明哪个参数是callback类型即可。

Dubbo将基于长连接生成反向代理,这样就可以从提供方调用消费方的逻辑。

简而言之,就是服务提供方调用服务消费方的逻辑。

1、接口层修改:

增加一个接口和一个类:

1 package com.yas.api;
2 
3 public interface SiteServiceListener {
4     void changed(String data);
5 }
 1 package com.yas.api;
 2 
 3 import java.io.Serializable;
 4 
 5 public class SiteServiceListenerImpl implements SiteServiceListener, Serializable {
 6     @Override
 7     public void changed(String data) {
 8         System.out.println("changed:"+data);
 9     }
10 }

 

修改SiteService接口:

package com.yas.api;

public interface SiteService {
    String getName(String name);

    //回调方法
    default String getName(String name,String key,SiteServiceListener siteServiceListener){
        return null;
    }
}

 

2、提供方代码:

 1 package com.yas.serviceprovider.impl;
 2 
 3 import com.yas.api.SiteService;
 4 import com.yas.api.SiteServiceListener;
 5 import org.apache.dubbo.config.annotation.Argument;
 6 import org.apache.dubbo.config.annotation.Method;
 7 import org.apache.dubbo.config.annotation.Service;
 8 //参数method:用于标注被代理的方法的名称和用于回调的类型
 9 //参数callback:每个连接允许的回调实例数
10 @Service(version = "callback",
11         methods = {@Method(name="siteName",arguments = {@Argument(index=2,callback = true)})},
12         callbacks = 3)
13 public class CallbackSiteServiceImpl implements SiteService {
14     @Override
15     public String getName(String name) {
16         return null;
17     }
18 
19     @Override
20     public String getName(String name, String key, SiteServiceListener siteServiceListener) {
21 //        return SiteService.super.getName(name, key, siteServiceListener);
22         siteServiceListener.changed("provider data");
23         return "callback:key="+key+",name="+name;
24     }
25 }

 

3、消费方代码:

 1 @RestController
 2 public class CallbackController {
 3 
 4     @Reference(version = "callback")
 5     SiteService siteService;
 6 
 7     @RequestMapping("/callback")
 8     public String getName(@RequestParam("name") String name){
 9         return siteService.getName(name,"key1",new SiteServiceListenerImpl());
10     }

 

4、测试:

使用postman请求地址:http://localhost:8000/callback?name=zhangsan

得到响应如下:

 

 

 同时在提供方的控制台可以看到如下信息:

 

 表明回调已经正常执行。

posted on 2021-11-04 13:53  Sempron2800+  阅读(247)  评论(0编辑  收藏  举报