需求:项目增加幂等

场景:
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为请求参数)

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

圈重点:

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

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

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

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

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

  1. String inter = "com.xxx.xxx.xxx.IxxxService";
    String methodName = "xxxxx";
    Class<?> mClass = Class.forName(inter);
  2. Map<String,Object> map = new HashMap<>();
  3. AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  4. Object obj = context.getBean(this.getBeanName(inter));
  5. Method method = mClass.getMethod(methodName,new Class[]{Object.class});
  6. Object object = method.invoke(obj,JSON.toJSON(map));
  1. public String getBeanName(String str){
  2. String name = str.substring(str.lastIndexOf(".")+2,str.length());
  3. name = name.substring(0,1).toLowerCase() + name.substring(1,name.length());
  4. return name;
  5. }

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

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

  

java反射调用dubbo接口的更多相关文章

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

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

  2. Java 反射 调用私有域和方法(setAccessible)

    Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...

  3. java springboot调用第三方接口 借助hutoool工具类 爬坑

    楼主是个后端小白一枚,之前没接触过后端,只学了java基本语法,还是在学校老师教的,学的很浅,什么ssh.ssm框架都没有学,最近在自学spring boot,看书学也看不是很懂,就在b站上看教学视频 ...

  4. 【Jmeter测试】使用Java请求进行Dubbo接口的测试

    如何构建一个Dubbo接口测试的通用框架(https://github.com/nitibu/jmeter-dubbo-test)​从上面的流程我们可以看出,测试类大致的一个结构: 使用json文件来 ...

  5. java 反射调用支付SDK

    在android开发中会遇到各种SDK的接入,很是麻烦.最初在想能不能把所有的SDK都 融合到一个当中,发现有点异想天开.但是也可以解决SDK资源不小心没有引入,导致程序调用接口崩溃问题.经过查资料, ...

  6. 通过Java反射调用方法

    这是个测试用的例子,通过反射调用对象的方法.     TestRef.java import java.lang.reflect.Method; import java.lang.reflect.In ...

  7. Java 反射 调用私有构造方法

    单例类: package singleton; public class SingletonTest { // 私有构造方法 private SingletonTest(){ System.out.p ...

  8. java黑魔法-反射机制-02-通过Java反射调用其他类方法

    package com.aaron.reflect; import java.lang.reflect.Method; import java.lang.reflect.InvocationTarge ...

  9. java反射调用api

    cglib的fastmethod 简单示例: FastClass serviceFastClass = FastClass.create(Person.class); Person p = new P ...

随机推荐

  1. python 二叉树实现

    二叉树实现思想 1.把每个节点都看作是一个对象包含以下特征: 节点的当前值 节点的左孩子(存储比当前节点值小的节点对象) 节点右孩子(存储比当前节点值大的节点对象) 2.二叉树就是以根节点开始的连续的 ...

  2. 团队作业-Week9-软件项目的风险

    一.软件项目中的风险 软件项目的风险无非体现在以下四个方面:需求.技术.成本和进度.IT项目开发中常见的风险有如下几类: (1)需求风险 ①需求已经成为项目基准,但需求还在继续变化: ②需求定义欠佳, ...

  3. 关于前段JS代码报错问题的解决方法

    最近接手别人的一个项目,项目导入到Myeclipse中,JS代码一直报错,说missing semicolon.该错误是Myeclipse在检查JS代码的过程出现的. 后来经过检查,发现JS代码本身没 ...

  4. part2

    一. 列表.元组操作 切片:取多个元素 #!/usr/bin/env python # _*_ coding:utf-8 _*_ #切片:取多个元素 names = ['cai','xiao','lo ...

  5. 使用 nodeJs 开发微信公众号(上传图片)

    在给用户发送消息中涉及到的素材(图片.视频.音频.文章等)需要事先传到微信服务器,然后获得媒体id(media_id),然后把 media_id 传递给用户 上传分上传临时素材(只保存三天)和上传永久 ...

  6. oss对象云存储

    import qiniu import uuidimport config def qn_upload_voice(fileData): '''上传语音到七牛云 @arg: fileData - 编码 ...

  7. logstash定时将mysql种数据同步到elasticsearch

    以Windows操作系统为例 1.下载logstash安装包,解压,配置好环境 2.在config目录中新增一个jdbc.conf input { stdin { } jdbc { # mysql 数 ...

  8. SQL 字段修改

    1.修改字段名: alter table 表名 rename column A to B 2.修改字段类型: alter table 表名 alter column 字段名 type not null ...

  9. 1、let const

    1.作用域的概念 es6之前 es5 分为 全局作用域 函数作用域 es6 新增块级作用域 2.let const 与 var 区别 用var 可以无报错 此代码报错 引出 块级作用域 用 {} 包起 ...

  10. Homework:工作日 还是周末

    /* 程序功能: 要求用户从键盘输入1~7之间的整数 如果输入的是1~5, 提示用户是工作日,要努力工作: 如果输入的是6或7,提示用户是休息日,放松休息: 否则,提示用户输入不在合法范围 */ #i ...