文档章节

jsonrpc-4j代码解析

郭恩洲_OSC博客
 郭恩洲_OSC博客
发布于 06/20 20:30
字数 417
阅读 14
收藏 0
点赞 0
评论 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博客
粉丝 31
博文 240
码字总数 112255
作品 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如何获取监控数据

############ 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
【原创】RabbitMQ 之 HTTP server 插件(翻译)

HTTP server plugin HTTP 服务器插件 The rabbitmq-mochiweb plugin provides hosting for other plugins that have HTTP interfaces. It allows these interfaces to co-exist on one or mo......

摩云飞
2015/04/27
0
0
Go语言的RPC介绍(含Protobuf-RPC)

本文在 Golang中国博客 的地址: http://blog.go-china.org/09-protorpc 标准库的RPC RPC是远程调用的简称, 简单的说就是要像调用本地函数一样调用服务器的函数. Go语言的标准库已经提供了RPC...

chai2010
2014/01/08
0
5
(二)Python调用Zabbix api之从入门到放弃——登录并获取身份验证令牌

访问zabbix api的URL是: http://x.x.x.x/zabbix/apijsonrpc.php x.x.x.x可能是你的IP或者域名 访问流程概览: 1、首先登录 2、认证成功后zabbix server返回一个token 3、带着这个token去访问...

TtrToby
06/26
0
0
kurento学习进阶一(源码库依赖关系)

Developer Guide¶ This section is a comprehensive guide for development of Kurento itself. The intended reader of this text is any person who wants to get involved in writing c......

liuweihui521
04/13
0
0
基于JSON RPC的一种Android跨进程调用解决方案了解一下?

基于JSON RPC的一种Android跨进程调用解决方案了解一下? 基于JSON RPC的一种Android跨进程调用解决方案了解一下? 简介 今天上午,看票圈有朋友分享爱奇艺的跨进程通信框架——Andromeda,觉...

流水不腐小夏
05/30
0
0
twisted的jsonrpc

服务端: from txjsonrpc.web import jsonrpc class AgentResource(jsonrpc.JSONRPC): repstr = 'agent' def init(self, master): self.master = master def jsonrpcuplocation(self, *args):......

flyking
2014/01/03
0
0
php程序员如何开发区块链、以太坊、智能合约的教程

以太坊是备受关注的区块链,它基于密码学技术和P2P通信技术 构建了一个去中心化的平台,所有的交易同步保存在每个节点中, 通过将区块单向级联成链,以太坊有效的保证了交易的不可篡改: 智能...

笔阁
07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现服务启动之后,马上执行任务的几种方法

有哪些方法 实现服务启动之后,马上执行相关操作? 方式一 :@PostConstruct 对类的要求 无,普通的java bean即可 例如: /*** * 执行完构造方法之后就会执行该方法 */@PostConstruc...

黄威
17分钟前
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部