文档章节

jsonrpc-4j代码解析

郭恩洲_OSC博客
 郭恩洲_OSC博客
发布于 06/20 20:30
字数 417
阅读 28
收藏 0

解析文件

  • AutoJsonRpcServiceImplExporter
  • JsonServiceExporter

AutoJsonRpcServiceImplExporter

路径:com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter

AutoJsonRpcServiceImplExporter 是与spring 自动注册service启动类

实现 BeanFactoryPostProcessor 后置拦截器,具体了解可点击访问

  • postProcessBeanFactory() 是重载实现接口方法 也是该类入口;
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
	    //扫描注解@JsonRpcService 的类
		DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
		Map<String, String> servicePathToBeanName = findServiceBeanDefinitions(defaultListableBeanFactory);
		//循环注册Service,
		for (Entry<String, String> entry : servicePathToBeanName.entrySet()) {
			registerServiceProxy(defaultListableBeanFactory, makeUrlPath(entry.getKey()), entry.getValue());
		}
	}
  • findServiceBeanDefinitions() 扫描注解@JsonRpcService 的类 形成 key-value 结果集 key 是jsonrpc注解值,value 是 servicebeanName名称. serviceBeanNames.put(path, beanName);

//TODO

  • registerServiceProxy(defaultListableBeanFactory, makeUrlPath(entry.getKey()), entry.getValue())

entry.getKey() 是jsonrpc注解值 entry.getValue() 是 servicebeanName名称

BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(JsonServiceExporter.class).addPropertyReference("service", serviceBeanName);

registerServiceProxy 方法内部做了一些属性注入

	if (objectMapper != null) {
			builder.addPropertyValue("objectMapper", objectMapper);
		}

		if (errorResolver != null) {
			builder.addPropertyValue("errorResolver", errorResolver);
		}

		if (invocationListener != null) {
			builder.addPropertyValue("invocationListener", invocationListener);
		}

		if (registerTraceInterceptor != null) {
			builder.addPropertyValue("registerTraceInterceptor", registerTraceInterceptor);
		}

		if (httpStatusCodeProvider != null) {
			builder.addPropertyValue("httpStatusCodeProvider", httpStatusCodeProvider);
		}

		if (convertedParameterTransformer != null) {
			builder.addPropertyValue("convertedParameterTransformer", convertedParameterTransformer);
		}

		if (contentType != null) {
		//设置response类型
			builder.addPropertyValue("contentType", contentType);
		}
		builder.addPropertyValue("backwardsCompatible", backwardsCompatible);
		builder.addPropertyValue("rethrowExceptions", rethrowExceptions);
		builder.addPropertyValue("allowExtraParams", allowExtraParams);
		builder.addPropertyValue("allowLessParams", allowLessParams);
		builder.addPropertyValue("shouldLogInvocationErrors", shouldLogInvocationErrors);

defaultListableBeanFactory 是IOC始祖,提定义Bean注册监听;

defaultListableBeanFactory.registerBeanDefinition(servicePath, builder.getBeanDefinition());

JsonServiceExporter 实现HtttpHandler,最终容器注册是这个Bean的实例.

class JsonServiceExporter extends AbstractJsonServiceExporter implements HttpRequestHandler {
    
    //jsonRpcServer 顶级实例
	private JsonRpcServer jsonRpcServer;

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void exportService() {
		jsonRpcServer = getJsonRpcServer();
	}

	/**
	 * {@inheritDoc}
	 */
	public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    //核心方法执行入口
		jsonRpcServer.handle(request, response);
		response.getOutputStream().flush();
	}

}

JsonRpcMultiServer

/**
 * A multiple service dispatcher that supports JSON-RPC "method" names
 * that use dot-notation to select a server endpoint.  For example:
 * <pre>
 * {
 *    "jsonrpc": "2.0",
 *    "method": "service.method",
 *    "params": {"foo", "bar"},
 *    "id": 1
 * }
 * </pre>
 * An example of using this class is:
 * <code>
 *    JsonRpcMultiServer rpcServer = new JsonRpcMultiServer();
 *    rpcServer.addService("Foo", new FooService())
 *             .addService("Bar", new BarService());
 * </code>
 * A client can then call a <i>test(String, String)</i> method on the Foo service
 * like this:
 * <pre>
 * {
 *    "jsonrpc": "2.0",
 *    "method": "Foo.test",
 *    "params": ["some", "thing"],
 *    "id": 1
 * }
 * </pre>
 */

© 著作权归作者所有

共有 人打赏支持
郭恩洲_OSC博客
粉丝 35
博文 242
码字总数 114208
作品 0
徐汇
高级程序员
私信 提问
groovy实现JSONRPC

介绍 groovy-jsonrpc JSONRPC的JAVA和GROOVY实现,能够将java类(包括groovy脚本)的公有静态方法通过jsonrpc2.0暴露出来。地址:https://github.com/wonder365/groovy-jsonrpc 。 JSONRPC2...

wonder365
2013/03/14
0
2
Zabbix 调用API 批量添加主机等

今天介绍跟实验两种方法调用api接口去批量添加批量管理zabbix客户端主机: 首先看官网介绍: 概观 Zabbix API允许您以编程方式检索和修改Zabbix的配置,并提供对历史数据的访问。它被广泛用于...

拎壶冲冲冲
08/24
0
0
jsonrpc4j报错:java.net.SocketException: Unexpected end of file from server,如何使用jsonrpc1.0版本呢?

想使用JSON RPC接口获取OVSDB的数据,采用了jsonrpc4j开源框架,代码如下: public static void main(String[] args) throws Throwable {// JsonRpcHttpClient jsonRpcHttpClient = new Json......

一直在路上ing
前天
0
0
详解通过Zabbix如何获取监控数据

############ zabbix基本架构 1.Server zabbix系统核心进程,轮询并捕获数据、发送通知等。是zabbix agent和zabbix proxy汇报数据的对象。server自身可远程检测网络服务。所有的前后端配置、...

eui988
2015/06/20
0
0
RabbitMQ管理插件的安装

先安装rabbitmq-server这里就不写了,之前有篇文章里有相关步骤:RabbitMQ的安装与配置 如果/etc/rabbitmq不存在会报如下错误: Error: {cannotwriteenabledpluginsfile,”/etc/rabbitmq/ena...

openthings
2015/05/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一个案例彻底弄懂如何正确使用 mysql inndb 联合索引

摘要: 有一个业务是查询最新审核的5条数据 ```sql SELECT `id`, `title` FROM `th_content` WHERE `audit_time` < 1541984478 AND `status` = 'ONLINE' ORDER BY `audit_time` D. 原来链接 ......

阿里云官方博客
10分钟前
1
0
详解如何用爬虫采集视频播放量数据(以腾讯视频为例)

现代社会提到大数据大家都知道这是近几年才形成的对于数据相关的新名词,在1980年,著名未来学家阿尔文·托夫勒便在 《第三次浪潮》一书中,将大数据热情地赞颂为“第三次浪潮的 华彩乐章”...

技术阿飞
15分钟前
1
0
区块链时代的拜占庭容错:Tendermint(二)

原文题目:《Tendermint: Byzantine Fault Tolerance in the Age of Blockchains》 原文作者:Ethan Buchman 翻译:饶云坤 校对:傅晓波 本文为节选 以下为正文: 本章阐述Tendermint共识算法...

万向区块链
28分钟前
0
0
AS连接网易Mumu模拟器

1、安装模拟器 打开这个网址现在模拟器然后安装 http://mumu.163.com/ 2、安装完成后启动模拟器 3、进入模拟器安装目录 例如本机的安装目录:C:\Program Files (x86)\MuMu\emulator\nemu\vmo...

HGMrWang
35分钟前
9
0
设计要做到扩展性强还挺难的

概述 在日常开发中,有时候你的上司会跟你说,这个模块的设计扩展性要高。把这句话说出来很简单,但是要做到则非常难。导致难的其中一个因素是: 你不熟悉这个行业的业务的玩法 我举个例子来...

Sam哥哥聊技术
37分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部