- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.11.0</version>
</dependency>
通过 IDL(.thrift 文件)定义数据结构、异常和接口等数据,供各种编程语言使用
namespace * thrift.generatecode
typedef i32 int
typedef string String
typedef bool boolean
// 数据结构
struct Student{
1:optional String name,
2:optional int age
}
// 异常
exception MyException{
1:optional String data
}
// 接口
service StudentService{
list<Student> queryStudents() ,
boolean addStudent(1:required String name,2:int age) throws(1:MyException e)
}
thrift --gen java src/thift/Student.thrift
package thrift;
import org.apache.thrift.TException;
import thrift.generatecode.MyException;
import thrift.generatecode.Student;
import thrift.generatecode.StudentService;
import java.util.ArrayList;
import java.util.List;
public class StudentServiceImpl implements StudentService.Iface {
@Override
public List<Student> queryStudents() throws TException {
System.out.println("--Java服务端,模拟查询操作--");
Student Student1 = new Student();
Student1.setName("zs");
Student1.setAge(23);
Student Student2 = new Student();
Student2.setName("ls");
Student2.setAge(24);
List<Student> Students = new ArrayList<>();
Students.add(Student1);
Students.add(Student2);
System.out.println("--查询完毕--");
return Students;
}
@Override
public boolean addStudent(String name, int age) throws MyException, TException {
System.out.println("--Java服务端,模拟增加操作--");
System.out.println("增加成功:" + name + "," + age);
return true;
}
}
package thrift;
import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;
import thrift.generatecode.StudentService;
public class TestThriftServer {
public static void main(String[] args) throws TTransportException {
// 使用多线程、非阻塞式的工作模式
TNonblockingServerSocket server = new TNonblockingServerSocket(8888);
THsHaServer.Args ServerArgs = new THsHaServer.Args(server).minWorkerThreads(3).maxWorkerThreads(5);
StudentService.Processor<StudentServiceImpl> processor = new StudentService.Processor<>(new StudentServiceImpl());
// 使用二进制格式传输数据
ServerArgs.protocolFactory(new TBinaryProtocol.Factory());
// 使用 TFramedTransport 方式传输数据
ServerArgs.transportFactory(new TFramedTransport.Factory());
ServerArgs.processorFactory(new TProcessorFactory(processor));
TServer tserver = new THsHaServer(ServerArgs);
// 启动服务
tserver.serve();
}
}
编写客户端代码,用于和服务端之间进行 RPC 调用。需要注意,客户端和服务端所使用的传输方式和传输协议必须保持一致。
package thrift;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import thrift.generatecode.Student;
import thrift.generatecode.StudentService;
import java.util.List;
public class TestThriftClient {
public static void main(String[] args) {
TTransport transport = new TFramedTransport(new TSocket("127.0.0.1", 8888), 1000);
TProtocol protocol = new TBinaryProtocol(transport);
// 创建用于访问服务端的对象
StudentService.Client client = new StudentService.Client(protocol);
try {
// 与服务端建立连接
transport.open();
System.out.println("RPC调用服务端的queryStudents()方法");
List<Student> Students = client.queryStudents();
for (Student Student : Students) {
System.out.println(Student.getName() + "\t" + Student.getAge());
}
System.out.println("RPC调用服务端的addStudent()方法");
boolean result = client.addStudent("ww", 25);
if (result) {
System.out.println("增加成功!");
} else {
System.out.println("增加失败!");
}
} catch (TException e) {
e.printStackTrace();
} finally {
transport.close();
}
}
}
--Java服务端,模拟查询操作--
--查询完毕--
--Java服务端,模拟增加操作--
增加成功:ww,25
RPC调用服务端的queryStudents()方法
zs 23
ls 24
RPC调用服务端的addStudent()方法
增加成功!
我正在使用 Ubuntu 10.04 LTS 机器,我在该机器上克隆了 Thrift 的 git 存储库并从源代码本地构建它。但是最新版本的 API 有一些变化,这导致应用程序的构建过程失败。 由于仅
尽管 Thrift 格式使用相对广泛(并且项目仍然存在),但我无法找到底层数据格式的规范。或格式,因为显然至少有两种格式;标准之一,紧凑的格式。 鉴于它的广泛使用,我希望它只是我可怜的 google-
每个参数(字段标识符)之前的数字的用途是什么?为什么从 5 跳到 16? struct Tweet { 1: required i32 userId; 2: required stri
我已经在 mac 中安装了 thrift。 从终端看起来 thrift 已成功安装但是当我尝试运行 thrift 命令时,我得到以下信息 Thrift: command not found 我从终端使
我在 c++ 中有一个结构,它存储这样的字节: struct RemoteData { /// some other fields here unsigned char* buf;
我想在 IDL 文件中定义几个结构。然后在服务中返回该结构类型的对象。为此,我必须导入该结构。如何在 IDL 中导入它们。 namespace java abc.xyz struct struct_{
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我使用thrift编译器(0.9.3)生成gen-go文件夹,同时编译器生成一个函数thrift.PrependError,在thrift 包(git.apache.org/thrift.git/li
假设我在包含两个字段的 Apache Thrift IDL 文件中定义了一个结构。例如: struct Thing { 1: optional string name, 2: optional
是否有可能使用 Thrift 来表示诸如 Java 类型 Map 之类的东西,其中 Map 中的值是已知的,例如是字符串还是整数? 换句话说,是否有任何方法来表示实际基类型仅在运行时已知但保证是一组预
我需要使用 Ruby 实现 Thrift API。 在生产环境中运行服务器有哪些选项? 最好的选择是什么? 目前我只是实例化一个 SimpleServer 并在其上调用 #serve。这显然是一个蹩脚
我正在查看 thirft 代码生成器的文档。它是这样开始的: Usage: thrift [options] file Options: -version Print the compile
所有教程和文档都建议每个 Thrift 服务器可以提供一项服务(1 个处理程序 1 个处理器 1 个服务器,全部在构造函数等中给出)。 从我的观点(优雅的设计)来看,如果许多或所有服务定义可以独立会更
我正在寻找 C++ 异步客户端和非阻塞 C++ 服务器实现。我在 apache 中看到一些邮件文件,但该事件是 2009 年末的。想知道最新的 thrift 是否支持它。我正在对 C++ 代码使用 c
我一直在研究使用 Apache Thrift,但发现文档有些缺乏。现在我有兴趣看到支持的目标语言以及每种语言支持的协议(protocol),是否有这样的矩阵? 最佳答案 试试这个: Thrift La
使用 C++ Apache Thrift 库,是否可以仅使用序列化/反序列化而不使用 RPC 服务? 据我了解 this页面,可以使用 Java 库来完成。但是,我找不到 C++ 库的类似类。 最佳答
Thrift 解析器有一个“注解”的定义: https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob;f=compiler/cpp/src
我的组织设置了一个 Spark Thrift 服务器,该服务器配置为使用 HTTP 上的 SSL。目的是使 Power BI 能够通过 Spark 安全地检索数据。然而,仅仅检索架构信息可能需要长达
我正在我的 Mac 上运行一对使用 Apache Thrift 进行通信的客户端和服务器程序。在我们的生产系统中,我们可能最终会遇到客户端使用TJSONProtocol,服务端使用TBinaryPro
来自 Thrift website 的示例 int multiply(1:int n1, 2:int n2); 为什么我们必须使用标签 1:和 2:在变量名之前,这个标签的目的是什么? 最佳答案 这些
我是一名优秀的程序员,十分优秀!