概述
我写了个方法,可以给方法传递指定的Dubbo接口名,方法名,参数值,方法来调用我们指定的Dubbo接口,并返回结果。
这次用的是Dubbo的GenericService。
示例代码:
@Controller
@RequestMapping("/test")
public class TestController {
/**
* @param interfaceName Dubbo接口名
* @param methodName 方法名
* @param parameter 参数值
* @return
*/
@RequestMapping(value = "/test2", method = RequestMethod.POST)
@ResponseBody
public static Object test2(@RequestParam(value = "interfaceName") String interfaceName,
@RequestParam(value = "methodName") String methodName,
@RequestParam(value = "parameter") String parameter) {
ApplicationConfig application = new ApplicationConfig("test-consumer"); //参数为dubbo消费方的名称
RegistryConfig registryConfig=new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181");
application.setRegistry(registryConfig);
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
reference.setApplication(application);
reference.setInterface(interfaceName);
// reference.setGroup("my-group");
// reference.setVersion("1.0.0");
reference.setTimeout(3000);
reference.setGeneric(true);
GenericService genericService = reference.get();
Object object = genericService.$invoke(methodName, new String[]{"java.lang.String"}, new Object[]{parameter}); //调用泛化接口,返回单一元素
//列表查询测试
Query query = new Query();
query.setOrderStatus(1);
Object object2 = genericService.$invoke("selectList", new String[]{"com.test.Query"}, new Object[]{query}); //调用泛化接口,返回列表
System.out.println(object2);
return object;
}
public static void main(String[] args) {
test2("com.test.OrderService","selectOne","ABC123");
}
}
注:
1,registryConfig.setAddress()方法填写的zookeeper的地址。
2,调用泛化接口时,reference.setGeneric(true)是必要的。
GenericService简介
GenericService是Dubbo提供的泛化接口。
当服务提供者使用这个接口时,可以省略Interface的代码,省略方法和参数的声明,通过指定接口名称的方式接入zookeeper。这时GenericService变成了一个网关。
当服务消费者使用这个接口时,有个好处是不依赖服务提供者的Interface接口类,而是通过指定具体接口类地址的方式,创建消费者,并去zookeeper查找对应的提供者,然后发起调用。
GenericService接口只有一个方法:
Object $invoke(String var1, String[] var2, Object[] var3) throws GenericException;
其中第一个参数是方法名。
第二个参数是一个字符串数组,这是接口方法每个参数的类型全路径。
第三个参数是Object数组,是传给方法的具体参数列表。
$invoke()方法的返回值:当返回的是单个非简单元素时,返回值类型实际上是HashMap,当返回的是列表时,返回值类型实际上是ArrayList<HashMap>。
详细一点的介绍参见:
Dubbo的GenericService简介和基本使用
本文结束
三篇手动调用指定Dubbo接口的文章:
手动调用指定Dubbo接口(一)----Spring注入篇
手动调用指定Dubbo接口(二)----Reference篇
手动调用指定Dubbo接口(三)----GenericService篇
最后
以上就是纯真秀发为你收集整理的手动调用指定Dubbo接口(三)----GenericService篇的全部内容,希望文章能够帮你解决手动调用指定Dubbo接口(三)----GenericService篇所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复