走thrift tutorial得例子:
发现一个问题,在client发送 (1 DIVIDE 0):{
work.op = Operation.DIVIDE;
work.num1 = 1;
work.num2 = 0;
} 这种请求得时候,server本来应该返回InvalidOperation异常,client捕获。但是Server确实返回了,但是client并没有得到异常,而是success。
跟踪代码,发现server确实write 了异常到struct中,但是client read得时候,也read成功,不过在Calculator.java得2523行得“struct.setSuccessIsSet(true);”这行代码执行后,read返回得结果会根据isSuccessIsSet来返回结果,所以因此虽然server返回了异常InvalidOperation,但是因为isSuccessIsSet=true,所以client得“int quotient = client.calculate(1, work);” 不会抛出异常,直接返回success得默认值0.
见代码:
public void read(org.apache.thrift.protocol.TProtocol iprot, calculate_result struct) throws org.apache.thrift.TException {
System.out.println("calculate_resultStandardScheme read start!!!!!!!!");
org.apache.thrift.protocol.TField schemeField;
iprot.readStructBegin();
while (true)
{
schemeField = iprot.readFieldBegin();
if (schemeField.type == org.apache.thrift.protocol.TType.STOP) {
break;
}
switch (schemeField.id) {
case 0: // SUCCESS
System.out.println("calculate_resultStandardScheme read SUCCESS!!!!!!!!");
if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
struct.success = iprot.readI32();
// struct.setSuccessIsSet(true); // 这里默认是没有注释得。我注释了,异常就正常抛出了。
} else {
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
}
break;
case 1: // OUCH
System.out.println("calculate_resultStandardScheme read OUCH!!!!!!!!");
if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
struct.ouch = new InvalidOperation();
struct.ouch.read(iprot);
struct.setOuchIsSet(true);
System.out.println("calculate_resultStandardScheme read OUCH111111");
} else {
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
}
break;
default:
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
}
iprot.readFieldEnd();
}
iprot.readStructEnd();
System.out.println("calculate_resultStandardScheme struct:" + struct);
// check for required fields of primitive type, which can't be checked in the validate method
struct.validate();
}
分享到:
相关推荐
在本教程"thrift php教程thrift-tutorial-php-master.zip"中,我们将深入学习如何使用Thrift与PHP进行交互。 首先,Thrift的接口定义语言(IDL)是其核心特性之一,它允许我们以类似协议缓冲区(protobuf)的方式...
标题中的“Thrift--JSClient”指的是Apache Thrift在JavaScript客户端的使用。Apache Thrift是一种软件框架,用于构建跨语言的服务。它通过定义一个中间表示(IDL,接口定义语言)来构建服务,然后自动生成各种编程...
服务端抛出的异常会被封装成TException,客户端接收到时可以根据异常类型进行处理。 八、Thrift工具集 除了编译器,Thrift还提供了其他工具,如thrift-gen用于生成代码,thrift-test用于测试服务,以及thrift-...
个人经导师指导并认可通过的高分项目,评审分98分。主要针对计算机相关专业和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
- 异常处理:Thrift会抛出特定的异常,如`TTransportException`和`TApplicationException`,需要适当地捕获和处理。 - 性能优化:可以通过调整Thrift的传输层(如TFramedTransport或TBufferedTransport)和协议层...
http://chanian.com/2010/05/13/thrift-tutorial-a-php-client/ 原教程使用的是c++ server和php client. 我用c++和c#分别实现了client和server,他们之间可以用任意组合互相调用,没有太复杂的功能,非常利于初学...
maven-thrift-plugin-0.1.11-sources.jar
然后,通过运行`thrift-0.9.x.exe`,我们可以指定`.thrift`文件和目标语言,如Java、Python、C++等,生成相应的服务端和客户端代码。例如,在命令行中,我们可能会输入: ```bash thrift-0.9.x.exe --gen java my_...
maven-thrift-plugin-0.1.11.jar
【 Maven 和 Thrift 的结合:maven-thrift-client】 在软件开发中,Thrift 是一个强大的跨语言服务开发框架,由 Facebook 开发并开源。它允许开发者定义服务接口和服务数据类型,然后自动生成多种编程语言的客户端...
cassandra-thrift cassandra-thrift cassandra-thrift cassandra-thrift cassandra-thrift cassandra-thrift
maven插件 maven-thrift-plugin-0.1.10
【 Maven-Thrift-Server:构建Thrift服务的Maven实践】 在软件开发中,Thrift是一种高效的跨语言服务开发框架,由Facebook开发并开源。它允许定义数据类型和服务接口,然后自动生成各种编程语言的代码,使得不同...
Java中的yii2-thrift客户端测试 用法 要运行,请先安装Maven mvn install 然后启动应用程序 然后跑 java -jar target/yii2-thrift-test-client-java-1.0-SNAPSHOT-jar-with-dependencies.jar
"thrift-0.13.0.zip"这个压缩包包含了Thrift 0.13.0版本的源码和工具,用于生成Go语言的Thrift接口。Thrift IDL文件描述了HBase服务的接口,包括批量读写操作。批量操作在HBase中是非常重要的,因为它们可以显著提高...
总结,Laravel开发与Thrift-Laravel的结合,让开发者能够充分利用Laravel的便利性和Thrift的高性能特性,构建出可扩展、易于维护的分布式系统。通过理解和掌握Thrift-Laravel,开发者可以提升服务之间的通信效率,...
thrift 0.9.3 for vs2013/vs2015 直接打开 thrift-master-0.9.3\lib\cppVS2013\thrift.sln thrift-master-0.9.3\lib\cppVS2015\thrift.sln 编译即可
在Java环境下,`thrift-0.9.3.exe`会生成对应的Java源代码,包括服务接口类、服务处理类、结构体类以及必要的序列化和反序列化代码。服务接口类定义了服务的方法签名,服务处理类则包含这些方法的实际实现。结构体类...
本主题将详细探讨如何利用Java通过Thrift-0.9.1版本来读取HBase表数据。 HBase是一个基于Google Bigtable设计的开源NoSQL数据库,它构建在Hadoop之上,提供高可靠性、高性能、分布式的行存储。HBase支持实时读写,...