thrift/swift:ThriftMethodProcessor代码分析
来源:互联网 发布:中子星 知乎 编辑:程序博客网 时间:2024/06/14 08:25
thrift是一种跨语言的RPC框架,为了保证在各种语言下都能正确表述,IDL语言在设计的时候就只能选取各种语言的共性。
比如对于null,虽然在java中定义一个字段为Integer类型,那么这个字段就可以为null,但thrift不允许primitive类型的数据字段为null,因为在c/c++的struct的字段中没有null的概念。做为方法的参数传递,primitive类型也是同样的道理。
所以thrift client 发送调用服务方法时,如果方法的参数类型为Integer,你即使将该参数设置为null,服务端收到的值也不是null,而是0.
经过反复跟踪我总算找到将null参数转为0的位置,就在服务端com.facebook.swift.service.ThriftMethodProcessor
的私有方法readArguments
中,下面是readArguments
的代码,注意代码中作者添加的中文注释
private Object[] readArguments(TProtocol in) throws Exception { try { int numArgs = method.getParameterTypes().length; // 初始化参数数组,初始值都为null Object[] args = new Object[numArgs]; TProtocolReader reader = new TProtocolReader(in); // 先从收到的数据库根据fieldId 将不为null的服务方法参数解析出来, // 为null的参数不在收到的数据中出现 // 所以这个循环结束时,不为null的参数已经被正确解析并保存到args的对应位置了 // client填null(原本就是null)的参数对应的位置就是null, reader.readStructBegin(); while (reader.nextField()) { short fieldId = reader.getFieldId(); ThriftCodec<?> codec = parameterCodecs.get(fieldId); if (codec == null) { // unknown field reader.skipFieldData(); } else { // 将参数调用对应用的解码器ThriftCodec解析成正确的数据类型, // 存入arg数组对应的位置 args[thriftParameterIdToJavaArgumentListPositionMap.get(fieldId)] = reader.readField(codec); } } reader.readStructEnd(); // 在下面这个循环中,对args数组中为null的参数进行检查, // 如果是primitive类型则调用 Defaults.defaultValue方法返回缺省值 // 比如对于Integer类型缺省值就是0 // 如果删除掉这一整段循环代码,service端收到的Integer参数就可以是null int argumentPosition = 0; for (ThriftFieldMetadata argument : parameters) { if (args[argumentPosition] == null) { Type argumentType = argument.getThriftType().getJavaType(); if (argumentType instanceof Class) { Class<?> argumentClass = (Class<?>) argumentType; argumentClass = Primitives.unwrap(argumentClass); args[argumentPosition] = Defaults.defaultValue(argumentClass); } } argumentPosition++; } return args; } catch (TProtocolException e) { // TProtocolException is the only recoverable exception // Other exceptions may have left the input stream in corrupted state so we must // tear down the socket. throw new TApplicationException(TApplicationException.PROTOCOL_ERROR, e.getMessage()); } }
阅读全文
0 0
- thrift/swift:ThriftMethodProcessor代码分析
- thrift C++代码分析
- thrift源码研究-TBinaryProtocolT代码分析
- thrift源码研究-TCompactProtocolT代码分析
- thrift源码研究-TJSONProtocol代码分析
- [Thrift分析]
- Thrift源码分析(三)-- IDL和生成代码分析
- thrift:swift 命令行生成 IDL文件及Client java代码过程
- Thrift 框架分析1
- Thrift 框架分析1
- thrift分析目标
- Thrift示例分析
- thrift(1):TNonblockingServer分析
- 3、thrift原理重点分析之自动生成的代码详解
- thrift的binaryprotocol协议分析
- 简述thrift与应用分析
- Java 版本Thrift Server 分析
- thrift性能测试并分析
- project euler 16 Power digit sum
- 图片上传-并发性知识
- 谈谈Shiro的原理及在SSM和SpringBoot两种环境下的使用姿势(上篇)
- js导出excel表格
- Qt构建、运行、qmake的区别
- thrift/swift:ThriftMethodProcessor代码分析
- ssh免密码登陆
- C#_类和方法
- 打包 【SSL JudgeOnline 2294】
- centos6.5中搭建hadoop-2.6.0时使用rpm包安装mysql5.7.20 初始化出错解决方法
- 基础知识-域名与IP
- [UGUI][Unity插件]迷你地图小地图雷达系统及其使用方法
- SSM框架搭建(笔记迁移)
- 卷积网络原理理解