技术标签: java # httpInvoker
目的:模拟控制层Controller向业务层发送请求,远程调用
1、思路:控制层实现org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean,
业务层实现org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter
控制层去业务层寻找实例,然后通过反射执行方法,返回数据;
2、控制层:
配置:
<bean id="wanbaoService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="${rmi.address}"/>
<property name="serviceInterface" value="com.zjpii.wanbao.springrmi.WanbaoRMI"/>
</bean>
其中rmi.address 是业务层地址http://IP:端口/项目名/业务层实现HttpInvokerServiceExporter的自定义名 (http://localhost:8088/app/wanbaoAppRemote)
代码:
调用业务层方法的入口:
public class CallServiceUtil {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static <T> T callDataService(String springBeanId, String methodName, Object[] params, Class[] classes) {
T returncode = (T) CallWanbaoAppServiceUtil.CallDataappService(springBeanId, methodName, params, classes);
return returncode;
}
}
public class CallWanbaoAppServiceUtil {
public static Object CallDataappService(String springBeanId, String methodName, Object[] params, Class[] classes)
throws BaseException {
Object returnObject = null;
try {
WanbaoRMI dsjyyRMI = (WanbaoRMI) SpringContextHolder.getBean("wanbaoService");
returnObject = dsjyyRMI.invokeMethod(springBeanId, methodName, params, classes);
} catch (BaseException e) {
throw e;
} catch (ClassNotFoundException e) {
throw new BaseException(e);
} catch (NoSuchMethodException e) {
throw new BaseException(e);
}
return returnObject;
}
}
RMI的接口和接口实现
public interface WanbaoRMI {
public Object invokeMethod(String springbeanid, String methodName, Object[] params, Class[] classes)
throws ClassNotFoundException, NoSuchMethodException, BaseException;
}
public class WanbaoRMIImpl implements WanbaoRMI {
@Override
public Object invokeMethod(String springbeanid, String methodName, Object[] params, Class[] classes)
throws ClassNotFoundException, NoSuchMethodException, BaseException {
BaseWanbaoControl oBaseCallbackControl = BaseWanbaoControl.getInstance();
return oBaseCallbackControl.invokeMethod(springbeanid, methodName, params, classes);
}
}
业务层:
配置:
<bean id="wanbaoAppService" class="com.zjpii.wanbao.springrmi.impl.WanbaoRMIImpl" />
<bean name="wanbaoAppRemote" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="wanbaoAppService"/>
<property name="serviceInterface" value="com.zjpii.wanbao.springrmi.WanbaoRMI"/>
</bean>
反射调用方法,返回数据:
public class BaseWanbaoControl {
Log logger = LogFactory.getLog(BaseWanbaoControl.class);
// 单例容器
private static Map<String, Object> serviceHolder = new HashMap<String, Object>();
static class SingletonHolder {
static BaseWanbaoControl instance = new BaseWanbaoControl();
}
public static BaseWanbaoControl getInstance() {
return SingletonHolder.instance;
}
public Object invokeMethod(String springbeanid, String methodName, Object[] params, Class[] classes)
throws ClassNotFoundException, NoSuchMethodException, BaseException {
Object returnObject = null;
try {
// Class clz = Class.forName(className);
Object serviceObj = null;
if (serviceHolder.get(springbeanid) == null) {
// serviceObj = clz.newInstance();
serviceObj = SpringContextHolder.getBean(springbeanid);
serviceHolder.put(springbeanid, serviceObj);
} else {
serviceObj = serviceHolder.get(springbeanid);
}
logger.info("execute springbean:" + springbeanid + " method:" + methodName);
Method m = null;
try {
m = serviceObj.getClass().getMethod(methodName, classes);
} catch (Exception e) {
for (Method method : serviceObj.getClass().getDeclaredMethods()) {
if (method.getName().equals(methodName)) {
m = method;
break;
}
}
}
returnObject = m.invoke(serviceObj, params);
} catch (IllegalAccessException e) {
throw new BaseException(e);
} catch (IllegalArgumentException e) {
throw new BaseException(e);
} catch (InvocationTargetException e) {
if (e.getCause() instanceof BaseException) {
throw (BaseException) e.getCause();
} else {
throw new BaseException(e.getCause());
}
}
return returnObject;
}
}
SpringContextHolder:
<bean class="com.zjpii.wanbao.spring.SpringContextHolder" lazy-init="false" />
public class SpringContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
/**
* 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.
*/
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextHolder.applicationContext = applicationContext;
}
/**
* 取得存储在静态变量中的ApplicationContext.
*/
public static ApplicationContext getApplicationContext() {
checkApplicationContext();
return applicationContext;
}
/**
* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
checkApplicationContext();
return (T) applicationContext.getBean(name);
}
/**
* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<T> clazz) {
checkApplicationContext();
return (T) applicationContext.getBeansOfType(clazz);
}
private static void checkApplicationContext() {
if (applicationContext == null) {
throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");
}
}
}
给自己留下一个思考 springCloud中 feign的使用是 去注册中心寻找服务,然后根据地址像这样去调用吗
文章浏览阅读539次,点赞3次,收藏3次。线上服务器宕机问题的解决。如果你也有类似的问题,可以参考下。主要思路用mat 工具分析下.hprof文件_生产服务宕机了,我们通过哪些方式去定位问题
文章浏览阅读1.6k次。这是系列文章中的一篇,阅读本文前请先阅读《Windows下Qt 5.2 for Android开发入门》,以便确保开发环境和作者一致。部分文章被转发/转载却没有注明出处,特此声明:版权所有 foruok ,如需转载敬请注明出处(http://blog.csdn.net/foruok)。我将从实践出发,带领大家一步一步完成在 Android 上的第一个 Qt 应用: Hello Qt_qt kids
文章浏览阅读1.5k次,点赞3次,收藏11次。③只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息,并且更新过程收敛的快,不会出现RIP“坏消息传得慢”的问题。②发送的信息是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。③网络出现故障时,会出现慢收敛现象,俗称“坏消息传得慢”,使更新过程的收敛时间长。②路由器之间交换的是路由器中的完整路由表,因此网络规模越大,开销也越大。:BGP是不同自治系统的路由器之间交换路由信息的协议,是一种外部网关协议。②路由器交换的信息是当前路由器所知道的全部信息,即。_rip,ospf,bgp三个协议的区别
文章浏览阅读6.1k次。uni-app运行到微信小程序时报错:“[ pages/index/index.json 文件内容错误] pages/index/index.json: [“usingComponents”][“u-navbar”] 未找到”这是由于引用了第三方UI库,比如uview,pages.json配置easycom规则(按需引入),使用了npm安装方式,但微信开发者工具没有构建npm,可以改下下载方式// pages.json{ "easycom": { // 下载安装的方式需要前面_[ pages/index/index.json 文件内容错误] pages/index/index.json: ["usingcompon
文章浏览阅读6.7k次,点赞32次,收藏108次。嵌入式软件自留地 今天编者荐语:五分钟了解物联网SIM卡——这个文章刷新了我对sim卡的认识,不熟悉的可以看看~~以下文章来源于华为云IoT ,作者我是卤蛋这个文章来自网络,看了觉得不错,因此特意整理转载下。是华为iot小助手分享的,都知道华为在物联网领域是国内老大的地位,分享的文章还是比较有价值的。【摘要】SIM卡是移动通信中不可或缺的组成部分,在物联网解决方案中,设备移动上网也需要使用SIM卡。那么,SIM卡是什么?SIM卡有几种?各种SIM卡有什么区别?本文将为您答疑.._中移物联nb-iot模块 不认识sim卡
文章浏览阅读1.1w次。JavaScript 获取当前时间戳:第一种方法:var timestamp = Date.parse(new Date());第二种方法:var timestamp=new Date().getTime();第三种方法:var timestamp = (new Date()).valueOf();第一种:获取的时间戳是把毫秒改成000显示,_js unix时间戳
文章浏览阅读838次,点赞17次,收藏27次。还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。图片转存中…(img-lrSLZmoK-1710427356248)]由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
文章浏览阅读519次。mamp pro mac版是mac平台上最优秀的本地服务器搭配软件,也是最好的mysql开发环境和php开发环境,包含了acintosh、Apache、MySQL和PHP四大开发环境,用户只要轻松点选就能对架站、讨论区、论坛等必备的元件进行安装,让你轻松在mac平台上架设自己的web运行环境。Web运行环境——MAMP Pro功能亮点将wordPress主机发布到您的Live Hosting..._mamp pro 5.7
文章浏览阅读4.9k次。python学习笔记 类型判断,异常处理,终止程序,实例代码:#idle中按F5可以运行代码#引入外部模块 import xxx#random模块,randint(开始数,结束数) 产生整数随机数import randomimport sysimport ossecret = random.randint(1,10)temp = input("请输入一个数字\n")#print(type(temp..._程序抛出异常不一定终止程序
文章浏览阅读583次。C#中添加引用Dll文件必须先注册!!注册方法:regsvr32 *.dll (*代表Dll文件名称)!!_引用dll失败
文章浏览阅读685次,点赞14次,收藏25次。Visual Studio Code 的主要功能之一是其强大的调试支持。VS Code 的内置调试器有助于加速编辑、编译和调试循环。在插件库内搜索python Debugger,安装插件(1)创建debug_learning.py测试文件(2)设置断点(2)启动debug模式(3)debug的各个按钮的介绍以下文档基于内置的 Node.js 调试器,但大多数概念和功能也适用于其他调试器。在阅读有关调试的信息之前,首先创建一个示例Node.js应用程序会很有帮助。您可以按照Node.js演练安_python vs debug
文章浏览阅读112次。Python3.7.7+Django+Mysql5.7+pip list+HBuilderX(Vscode也行)+uni+Vue+Pychram社区版。[附源码]计算机毕业设计Python+uniapp家校通微信小程序rjeuh(程序+lw+远程部署)2. 前端:uni+css+javascript+jQuery+easyUI+highcharts。Django + uni小程序 +Python+Mysql 等等组成,B/S模式等等。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。_家校互通小程序开源