java反射调用dubbo接口
需求:项目增加幂等
场景:
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配置到数据库中,就能实现不用改动代码进行调用的操作了。
java反射调用dubbo接口的更多相关文章
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- Java 反射 调用私有域和方法(setAccessible)
Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...
- java springboot调用第三方接口 借助hutoool工具类 爬坑
楼主是个后端小白一枚,之前没接触过后端,只学了java基本语法,还是在学校老师教的,学的很浅,什么ssh.ssm框架都没有学,最近在自学spring boot,看书学也看不是很懂,就在b站上看教学视频 ...
- 【Jmeter测试】使用Java请求进行Dubbo接口的测试
如何构建一个Dubbo接口测试的通用框架(https://github.com/nitibu/jmeter-dubbo-test)从上面的流程我们可以看出,测试类大致的一个结构: 使用json文件来 ...
- java 反射调用支付SDK
在android开发中会遇到各种SDK的接入,很是麻烦.最初在想能不能把所有的SDK都 融合到一个当中,发现有点异想天开.但是也可以解决SDK资源不小心没有引入,导致程序调用接口崩溃问题.经过查资料, ...
- 通过Java反射调用方法
这是个测试用的例子,通过反射调用对象的方法. TestRef.java import java.lang.reflect.Method; import java.lang.reflect.In ...
- Java 反射 调用私有构造方法
单例类: package singleton; public class SingletonTest { // 私有构造方法 private SingletonTest(){ System.out.p ...
- java黑魔法-反射机制-02-通过Java反射调用其他类方法
package com.aaron.reflect; import java.lang.reflect.Method; import java.lang.reflect.InvocationTarge ...
- java反射调用api
cglib的fastmethod 简单示例: FastClass serviceFastClass = FastClass.create(Person.class); Person p = new P ...
随机推荐
- C++内存泄漏检测工具
C++内存泄漏检测工具 1.VC自带的CRT:_CrtCheckMemory 调试器和 CRT 调试堆函数 1.1用法: /************************************ ...
- 微信小程序学习 一
1. 目录结构 app.js —— 必须配置Page({}) 在新版本中 app.json —— 注册,路由不用加后缀,是将整个文件里面的四个文件都注册进去,并且做关联,所以在页面中就不需要引用 ...
- (Python基础)列表的认知
以下是列表的一些知识点 name = ['关羽','张飞','刘备','曹操','诸葛亮','吕布',['吕布','吕布',],'吕布','吕布','吕布','吕布']for i in name: p ...
- str中文初始化乱码,要用宽字符;if else
QString str = QString::fromUtf16(L"{\\"closeEt\": true,\\"data\" : [[1,1,10 ...
- consul的安装与使用
consul官网下载地址 https://www.consul.io/downloads.html 下载后解压 在bat文件中增加如下内容,就可以双击启动了 start consul agent -d ...
- webpy学(ban)习(砖)记录
参考链接:http://blog.csdn.net/caleng/article/details/5712850 参考代码:http://files.cnblogs.com/files/tacyeh/ ...
- Https证书配置
本文介绍配置免费证书的方法 具体步骤: 一.获取免费CA证书 步骤1到腾讯云找到: 二.申请完成 后域名验证指引 申请域名型证书,可以通过以下方式验证域名的所有权: 1. 手动 DNS 验证 通过解析 ...
- python 网站 监控返回值
import requests try: code = requests.get("https://api.sudaizhijia.cm/").status_code print( ...
- Java学习随笔(2)--爬虫--天气预报
public class Spiderweather { public static void main(String[] args) { List<String> list = null ...
- VUE框架的初识
VUE框架的初识 初步了解Vue.js框架(渐进式前端框架) Vue.js是一种轻量级的前端MVVM框架.同时吸收了React(组件化)和Angular(灵活指令页面操作)的优点.是一套构建用户界面的 ...