参数回调方式与调用本地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
得到响应如下:
同时在提供方的控制台可以看到如下信息:
表明回调已经正常执行。