需求:项目增加幂等

场景:
1.三个项目:a 、b、c
2.a项目加幂等
3.b项目dubbo调用项目a的时候超时没有获取返回结果,增加重试机制(非立即重试,3min or 5min 后重试)
4.c项目是一个异步的job项目,用来接收mq,异步处理,管理task等。

方案:
1.a项目设置请求流水id,将请求先存入redis缓存,处理完成之后更新redis中的状态,同一个流水id认为是重复提交,不进行业务处理,直接返回redis中的状态
2.b项目捕获调用a项目的超时异常,存入redis队列
3.c项目启动两个task,task1用来获取redis队列里面的信息,落库。task2用来扫库,及重试。

重点:
1.c项目只是异步接口消息没有业务处理逻辑
2.task2重试的时候需要通过dubbo接口调用b来进行重新发起请求,及后续处理。

这里重点分享一下通过反射机制调用dubbo接口(map为请求参数)

String inter = "com.xxx.xxx.xxx.xxx.xxx.xxx";
Class<?> mClass = Class.forName(inter);
Method method = mClass.getMethod("methodNamexxx",new Class[]{String.class});
Object object = method.invoke(mClass.newInstance(),JSON.toJSONString(map));   

圈重点:

1.inter需要是serviceImpl实现类,如果是interface的话,会报

Caused by: java.lang.NoSuchMethodException: com.xxx.xxx.xxx.xxx.xxx.<init>()

2.invoke(Object obj,Object... args) 这里的obj需要newInstance()一下,否则会报

java.lang.IllegalArgumentException: object is not an instance of declaring class

调用dubbo接口的写法:(map为请求参数)

String inter = "com.xxx.xxx.xxx.IxxxService";String methodName = "xxxxx";Class<?> mClass = Class.forName(inter);
Map<String,Object> map = new HashMap<>();
AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Object obj = context.getBean(this.getBeanName(inter));
Method method = mClass.getMethod(methodName,new Class[]{Object.class});
Object object = method.invoke(obj,JSON.toJSON(map));

public String getBeanName(String str){String name = str.substring(str.lastIndexOf(".")+2,str.length());name = name.substring(0,1).toLowerCase() + name.substring(1,name.length());return name;}

通过解析inter获取beanName,通过spring获取bean的方式获取对象进行反射调用。

将interface及method配置到数据库中,就能实现不用改动代码进行调用的操作了。  

  

转载于:https://www.cnblogs.com/Smilence1024/p/9685635.html

java反射调用dubbo接口相关推荐

  1. 利用java反射调用类的的私有方法--转

    原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...

  2. 利用java反射调用类的的私有方法

    http://blog.csdn.net/sunyujia/article/details/2501709 今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为在反射看来根 ...

  3. 【Java】Java反射调用可变参数的方法

    文章目录 1.概述 1.概述 因为要Java反射调用可变参数的方法,所以参考了这篇文章:https://www.cnblogs.com/huqingchen/p/5979936.html 但是测试过程 ...

  4. Java反射系列--Type接口及其子接口

    原文网址:Java反射系列--Type接口及其子接口_IT利刃出鞘的博客-CSDN博客 简介 说明 Type 是java反射机制中提供的一个接口,用来表示java中的所有类型的接口.它们包括原始类型. ...

  5. Java程序调用MATLAB接口

    Java程序调用MATLAB接口 文章目录 Java程序调用MATLAB接口 一.注意事项 二.环境安装 三.MATLAB如何生成JAR包 四.MATLAB生成的JAR包如何引入到Java程序中 五. ...

  6. Java——okhttp3调用API接口

    Java--okhttp3调用API接口 官方网站 本篇以java调用有课API接口为例,签名需要以map的key进行字典排序之后进行sha1加密算法后得出.有课API文档地址:https://pos ...

  7. java如何调用第三方接口

    最近在做一个项目,因一些机制问题,需要我用java代码调用第三方接口.因其接口使用的是@RequestBody注入访问对象的,@RequestBody接受收的是一个json格式的字符串,一定是一个字符 ...

  8. java 反射调用方法_java的反射机制,以及通过反射获取方法,变量等操作

    我们应用会用到反射这个知识点,肯定是想要在运行时得到类的信息,根据类的那些信息去做一些特定的操作.那么,首先无疑就是得到类的信息,在JDK中提供了Class对象来保存类的信息.所以,反射的第一步就是得 ...

  9. Java 编程问题:七、Java 反射类、接口、构造器、方法和字段

    原文:Java Coding Problems 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自[ApacheCN Java 译文集],自豪地采用谷歌翻译. 本章包括涉及 Java 反射 ...

最新文章

  1. 干货 | OpenCV看这篇就够了,9段代码详解图像变换基本操作
  2. mysql更新一个表里的字段等于另一个表某字段的值
  3. hdu 1814 字典序最小的2sat(暴力深搜)
  4. python 对图片进行直方图均衡化处理(批量自动遍历文件夹图片)
  5. Java集合框架:Collections工具类
  6. 第13课:动手制作自己的简易聊天机器人
  7. 分数小数互换图_重复控制器学习心得(二)——超前环节的分数化和校正因子的引入...
  8. Hash(散列)建表及查找
  9. Python之路(二)Python基础
  10. java中elapseTime设置新时间,Java ApplicationLike.getApplicationStartElapsedTime方法代码示例...
  11. python获取本地时间并向服务器发送udp报文_python3通过udp实现组播数据的发送和接收操作...
  12. 如何将 Mac 置入睡眠状态或唤醒 Mac?
  13. 电脑取消撤销快捷键是什么_必须掌握的十个电脑使用技巧
  14. 如何 gitignore .gitignore
  15. DEDECMS留言薄全站调用方法
  16. ubuntu 14.04.1 smbd环境搭建
  17. 循环的进阶:二重循环
  18. flink 任务提交问题汇总
  19. 中介者(Mediator)
  20. 灵敏度分享码显示服务器不可用,和平精英S11最稳灵敏度分享码有哪些?和平精英灵敏度设置分享码...

热门文章

  1. ps怎么一下选中多个图层_巧影多图层,photoshop中怎么同时选中两个或多个图层?...
  2. Java后端数据分页问题
  3. 一、以太坊单笔交易字段含义
  4. 虚拟机修改服务器mac地址,虚拟机修改服务器mac地址
  5. 区块链最后拼的是数据规模和数据处理能力
  6. 浅谈Google蜘蛛抓取的工作原理(待更新)
  7. iOS根据银行卡号识别银行
  8. Ansys HFSS软件常用设置
  9. 软件测试越老越吃香?还是吃青春饭?
  10. cpca和jieba