需求:项目增加幂等

场景:
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接口的更多相关文章

  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 编码的一些问题

    >>> ord('中') 20013 >>> chr(65) 'A' >>> chr(20013) '中' - Python文件默认是UTF-8编 ...

  2. react实现登录注册

    登录注册页面都分为上下两个部分,其中上部是logo,下部分是输入框,所以抽离出来三个组件 logo import React from 'react'import logoImg from './jo ...

  3. python 日期换算星期 蔡勒公式

    #!/usr/bin/env python # encoding: utf-8 #coding=utf-8 date_star={ ':'星期一', ':'星期二', ':'星期三', ':'星期四' ...

  4. arc 097 E - Sorted and Sorted

    E - Sorted and Sorted Time limit : 2sec / Memory limit : 1024MB Score : 600 points Problem Statement ...

  5. 如何解决button,a,input标签自带蓝色边框

    通常我们会设置该标签outline:0;但是我在使用iview自带的button组件的时候,设置无效,经过测试只要设置 :focus{      outline:0; }  即可,方便有效

  6. spring boot apollo demo

    controller 监听器,监听配置实时变化 src/main/resources---->META-INF---->app.properties apollo 界面 测试访问 : 实时 ...

  7. leetcode每日刷题计划-简单篇day10

    跳题,不熟悉的留到周末再做. 保持冷静,不信画饼. num 100 相同的树 Same Tree 做法可能不是特别简洁,注意一下.最后判断完子树以后,要确定根的数值是一样的 然后在isleaf的判定先 ...

  8. 在Airtest中如何使用无线模式控制手机

    在使用Airtest超快速开发App爬虫文章的最后,我们留了一个尾巴:如何启动Airtest的无线模式,不用USB线就能控制手机? 本文将会讲到具体的做法.做法分为两种:第一种是在Airtest的ID ...

  9. JHipster简介

    JHipster简介 JHipster或者称Java Hipster,是一个应用代码产生器,能够创建Spring Boot + AngularJS的应用.开源项目地址:JHipster/Github. ...

  10. 201772020113 李清华《面向对象程序设计(java)》第17周学习总结

    1.实验目的与要求 (1) 掌握线程同步的概念及实现技术: (2) 线程综合编程练习 2.实验内容和步骤 实验1:测试程序并进行代码注释. 测试程序1: l  在Elipse环境下调试教材651页程序 ...