Apache Thrift快速入门教程

Thrift是一种跨语言RPC框架,最初是在Facebook上开发的,现在作为Apache项目开源。 这篇文章将描述如何以不同的模式(例如阻塞,非阻塞和异步)编写Thrift服务和客户端。

(我觉得后两种模式的文档较少,需要一些教程类型的介绍,因此是本文的动机。) 为了轻松地遵循本教程,您对Thrift体系结构(由传输,协议和处理器组成)有基本的了解是有益的。 (可以在[1]上找到好的论文)。 在这里,我将使用Thrift 0.7版和Thrift的Java绑定。

节俭安装
可以在http://wiki.apache.org/thrift/ThriftInstallation中找到安装说明。

总结Ubuntu安装步骤。

1.安装所需的依赖项。
$ sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libevent-dev automake libtool flex bison pkg-config g ++ libssl-dev
2.转到安装根目录。 3. $ ./configure 4. $ make 5.成为超级用户并 $进行安装

现在让我们继续创建服务并使用它。

服务定义

此处定义了具有简单算术运算的服务。 请注意,使用typedef指令为基本类型i64和i32声明备用名称。 在名为“ 算术.thrift ”的文件中添加以下内容。

namespace java tutorial.arithmetic.gen  // define namespace for java codetypedef i64 long
typedef i32 int
service ArithmeticService {  // defines simple arithmetic service
long add(1:int num1, 2:int num2),
long multiply(1:int num1, 2:int num2),
}

代码将在“ tutorial.arithmetic.gen ”包下生成。

现在,使用以下命令行生成Java代码。

$ thrift –gen java算术.thrift

将生成源tutorial.arithmetic.gen.ArithmeticService.java

封锁模式

让我们创建一个阻塞模式的服务器和一个使用服务的客户端。

首先,我们需要使用生成的服务框架来实现服务。 要实现的接口是ArithmeticService.Iface。

public class ArithmeticServiceImpl implements ArithmeticService.Iface {public long add(int num1, int num2) throws TException {return num1 + num2;}public long multiply(int num1, int num2) throws TException {return num1 * num2;}}

现在,让我们创建Thrift服务器,该服务器将请求此服务。 请记住,这是一台阻塞服务器,因此执行I / O的服务器线程将等待。

public class Server {private void start() {try {TServerSocket serverTransport = new TServerSocket(7911);ArithmeticService.Processor processor = new ArithmeticService.Processor(new ArithmeticServiceImpl());TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));System.out.println("Starting server on port 7911 ...");server.serve();} catch (TTransportException e) {e.printStackTrace();}}public static void main(String[] args) {Server srv = new Server();srv.start();}}

这里使用了TThreadPoolServer实现,该实现将利用线程池来处理传入的请求。

现在让我们编写客户端。

public class ArithmeticClient {private void invoke() {TTransport transport;try {transport = new TSocket("localhost", 7911);TProtocol protocol = new TBinaryProtocol(transport);ArithmeticService.Client client = new ArithmeticService.Client(protocol);transport.open();long addResult = client.add(100, 200);System.out.println("Add result: " + addResult);long multiplyResult = client.multiply(20, 40);System.out.println("Multiply result: " + multiplyResult);transport.close();} catch (TTransportException e) {e.printStackTrace();} catch (TException e) {e.printStackTrace();}}public static void main(String[] args) {ArithmeticClient c = new ArithmeticClient();c.invoke();}
}

TBinaryProtocol用于对服务器和客户端之间传输的数据进行编码。 现在启动服务器,并使用客户端调用服务以生成结果。

非阻塞模式
现在让我们创建一个非阻塞服务器,该服务器在下面使用Java非阻塞I / O。 我们可以使用与以前相同的服务实现(ArithmeticServiceImpl)。

public class NonblockingServer {private void start() {try {TNonblockingServerTransport serverTransport = new TNonblockingServerSocket(7911);ArithmeticService.Processor processor = new ArithmeticService.Processor(new ArithmeticServiceImpl());TServer server = new TNonblockingServer(new TNonblockingServer.Args(serverTransport).processor(processor));System.out.println("Starting server on port 7911 ...");server.serve();} catch (TTransportException e) {e.printStackTrace();}}public static void main(String[] args) {NonblockingServer srv = new NonblockingServer();srv.start();}
}

在这里,使用TNonblockingServerSocket封装了ServerSocketChannel。

非阻塞客户端的代码如下。

public class NonblockingClient {private void invoke() {TTransport transport;try {transport = new TFramedTransport(new TSocket("localhost", 7911));TProtocol protocol = new TBinaryProtocol(transport);ArithmeticService.Client client = new ArithmeticService.Client(protocol);transport.open();long addResult = client.add(100, 200);System.out.println("Add result: " + addResult);long multiplyResult = client.multiply(20, 40);System.out.println("Multiply result: " + multiplyResult);transport.close();} catch (TTransportException e) {e.printStackTrace();} catch (TException e) {e.printStackTrace();}}public static void main(String[] args) {NonblockingClient c = new NonblockingClient();c.invoke();}}

注意使用TFramedTransport包装正常的TSocket传输。 非阻塞服务器要求客户端使用TFramedTransport,它将对通过网络发送的数据进行框架化。 启动服务器并使用客户端发送请求。 您将看到与以前相同的结果,这次使用非阻止模式。

异步模式

我们可以编写异步客户端来调用Thrift服务。 需要注册一个回调,该回调将在请求成功完成时被调用。 阻塞模式服务器在异步客户端上不起作用(方法调用返回的响应为空)(可能是因为我们在客户端使用TNonblockingSocket。请参见ArithmeticService.AsyncClient的构造。因此这可能是正确的行为)。 非阻塞模式服务器似乎可以正常工作。 因此,您可以将早期版本的非阻塞服务器与下面显示的客户端一起使用。

public class AsyncClient {private void invoke() {try {ArithmeticService.AsyncClient client = new ArithmeticService.AsyncClient(new TBinaryProtocol.Factory(), new TAsyncClientManager(),new TNonblockingSocket("localhost", 7911));client.add(200, 400, new AddMethodCallback());client = new ArithmeticService.AsyncClient(new TBinaryProtocol.Factory(), new TAsyncClientManager(),new TNonblockingSocket("localhost", 7911));client.multiply(20, 50, new MultiplyMethodCallback());} catch (TTransportException e) {e.printStackTrace();} catch (TException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {AsyncClient c = new AsyncClient();c.invoke();}class AddMethodCallbackimplements AsyncMethodCallback<ArithmeticService.AsyncClient.add_call> {public void onComplete(ArithmeticService.AsyncClient.add_call add_call) {try {long result = add_call.getResult();System.out.println("Add from server: " + result);} catch (TException e) {e.printStackTrace();}}public void onError(Exception e) {System.out.println("Error : ");e.printStackTrace();}}class MultiplyMethodCallbackimplements AsyncMethodCallback<ArithmeticService.AsyncClient.multiply_call> {public void onComplete(ArithmeticService.AsyncClient.multiply_call multiply_call) {try {long result = multiply_call.getResult();System.out.println("Multiply from server: " + result);} catch (TException e) {e.printStackTrace();}}public void onError(Exception e) {System.out.println("Error : ");e.printStackTrace();}}}

已经定义了两个回调,分别与服务的每个操作相对应。 请注意,这两个调用使用了两个客户端实例。 每个调用都需要一个单独的客户端实例,否则客户端将因以下异常而失败

线程“ main ”中的异常java.lang.IllegalStateException:客户端当前正在执行另一种方法:tutorial.arithmetic.gen.ArithmeticService $ AsyncClient $ add_call

因此,本文以不同的操作模式总结了我在Thrift上的快速入门。 希望有人会觉得有用。 如有任何建议或更正,请随时发表评论。

[1] http://thrift.apache.org/static/thrift-20070401.pdf

参考:来自JCG合作伙伴的 Apache Thrift快速入门教程   Source Open博客中的Buddhika Chamith。


翻译自: https://www.javacodegeeks.com/2012/03/apache-thrift-quickstart-tutorial.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数组拆分为新数组

package com.classes;//已知数组a&#xff0c;将奇数位置元素存到b数组中&#xff0c;偶数位置元素存到c数组中public class Shuzu1118_4 { public static void main(String[] args) { int [] a{3,6,9,1,4,7,2,5,8}; int [] b; //定义数组b int [] c; //定义数组c//先找出数组…

java数组交集_java数组的交集和并集

前两天给我出了一道题&#xff0c;求数组的并集和交集&#xff0c;然后我试着写一下&#xff0c;很尴尬&#xff0c;由于长时间没有写过代码&#xff0c;一开始数组是如何定义的给忘了。当时我说了我的思路&#xff0c;不过也是很low的做法&#xff0c;查阅网上的一些资料&…

ADF声明性组件示例

在我以前的文章中&#xff0c;我答应展示如何为智能值列表创建ADF声明性组件。 因此&#xff0c;我将创建一个包含三个元素的组件&#xff1a;标签&#xff0c;输入文本和值的组合框列表。 那很容易。 我在工作空间中创建了一个单独的ADF ViewController项目&#xff1a; 在此项…

VS2015 安装包缺失(联网安装失败)问题解决

Win7 x86 测试可行 * 如果前面有尝试过安装不成功, 一定要用卸载程序删除已安装的部分,否则会出乱子. 1. 或者是用虚拟光驱加载ISO, 或者是解压到硬盘上, 都没有关系. 2. 用管理员权限启动CMD控制台, 进入VS2015 安装盘的根目录 (vs_enterprise.exe 所在的目录). 3. 执行命令 …

java蓝桥暑假班_Java实现 蓝桥杯VIP 算法提高 班级排名

算法提高 班级排名时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB问题描述达达在陶陶的影响下&#xff0c;也对学习慢慢的产生了兴趣。他在每次考试之后&#xff0c;都会追着老师问&#xff0c;自己在班级的总名次是多少。考试一多&#xff0c;老师也不耐烦了&#xff…

$.ajax所犯的错误。success后面不执行

$.ajax({ type: post, url: ../AshxHandler/HandlerAddPhoto.ashx, data: { clientPath: photoName }, dataType: text, cache: false, success: function (data) { alert(1); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(上传图片出现错误&#xf…

WhateverOrigin –与Heroku和Play对抗相同的原产地政策! 构架

不久前&#xff0c;我在编码 Bitcoin Pie时发现需要克服臭名昭著的Same Origin Policy &#xff0c;该政策限制了运行在客户端浏览器上的javascript可以访问的域。 通过Stack Overflow&#xff0c;我找到了一个名为Any Origin的站点&#xff0c;这基本上是无需设置专用服务器即…

Solr集群更新配置的方式

solr集群中配置文件是经常更新的&#xff0c;频率最高的也就是schema.xml和solrconfig.xml这两个配置文件了&#xff0c;对于更新配置文件之前&#xff0c;我们先了解一下集群项目结构 由于在集群模式下&#xff0c;solrconfig.xml和schema.xml等配置文件都由Zookeeper集群管理…

java文本框双击可编辑_java swing 文本域双击变为可编辑

java swing如何实现文本域双击变为可编辑呢?给文本域添加鼠标事件监听程序即可:resultTA1new AssistPopupTextArea();resultTA1.setEditable(false);resultTA1.setLineWrap(true);resultTA1.setWrapStyleWord(true);resultTA1.addMouseListener(new MouseAdapter() {Overridep…

点击出现黑色背景的解决

-webkit-tap-highlight-color:rgba(0,0,0,0);转载于:https://www.cnblogs.com/luckyXcc/p/6085582.html

OSGi简介–模块化Java

OSGi联盟是这一搁浅的管理机构&#xff0c;它始于1999年。其最初目标是为网络设备创建开放搁浅。 基于此思想&#xff0c;此规范也针对Java引入。 Eclipse在Java中是第一个。 他们于2004年6月推出了基于OSGi的Eclipse IDE。 OSGi是在Java中定义动态模块的方法。 主要为Java实现…

HDU FatMouse's Speed 基本DP

题意&#xff1a;要求找到的体重递增&#xff0c;速度递减的老鼠&#xff0c;并且输出最长的长度数&#xff0c;而且输出各自的序列数。Special Judge 思路&#xff1a;先按体重由小到大排序&#xff0c;再找最长速度递减序列。 转移方程&#xff1a;mou[i].w>mou[j].w&am…

java xmpp openfire_搭建Xmpp服务器Openfire

step1、 安装java环境这里是检测是否安装java的网页如没有安装则进行以下步骤1、下载jdk7的mac版&#xff1a;jdk-7u79-macosx-x64.dmg2、安装好之后&#xff0c;在命令行进入以下路径查看#cd /Library/Java/JavaVirtualMachines/3、再查看你自己安装的版本#ls版本为jdk-8u171-…

JavaFX移动应用程序最佳实践,第1部分

到现在为止&#xff0c;所有对JavaFX感兴趣的人都会知道&#xff0c;JavaFX Mobile发行了不久 前。 可以肯定的是&#xff0c;这真是令人难以置信。 我感到筋疲力尽&#xff0c;在发行期间我什至没有精力去写博客…… 但是到目前为止&#xff0c;我感到很恢复&#xff0c;并且希…

Spark程序运行报错解决(1)

报错内容&#xff1a;System memory 259522560 must be at least 4.718592E8. Please use a larger heap size. 解决&#xff1a;Window——Preference——Java——Installed JREs——选中一个Jre 后 Edit 在Default VM arguments 里加入&#xff1a;-Xmx512M 转载于:https://w…

java setsolinger_java socket 的参数选项解读(转)

在MulticastSocket的源代码里有设置多播的方法&#xff1a;public void setInterface(InetAddress inf) throwsSocketException {if(isClosed()) {throw new SocketException("Socket is closed");}checkAddress(inf, "setInterface");synchronized(infLoc…

【转】Linux终端下 dstat 监控工具

转自https://linux.cn/article-3215-1.html dstat 是一个可以取代vmstat&#xff0c;iostat&#xff0c;netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些另外的功能&#xff0c;增加了监控项&#xff0c;也变得更灵活了。dstat可以很方便监控系统…

Tomcat和IntelliJ –在webapps文件夹之外部署war文件

目前&#xff0c;我正在开发一个Android应用程序&#xff0c;该应用程序需要云中托管的大量REST服务来支持。 我基于对Java&#xff0c;Groovy以及最重要的Spring的支持选择了Google App Engine 。 我开发了一个基于Spring MVC的REST应用程序&#xff0c;并使用ContentNegotiat…

[HDU1232] 畅通工程 (并查集 or 连通分量)

Input 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数&#xff0c;分别是城镇数目N ( < 1000 )和道路数目M&#xff1b;随后的M行对应M条道路&#xff0c;每行给出一对正整数&#xff0c;分别是该条道路直接连通的两个城镇的编号。为简单起见&#xff0c;城镇…

java jdbc连接db2数据库_Java连接db2数据库(常用数据库连接五)

1.安装好db2数据库&#xff0c;并建立表如下&#xff1a;2.eclipse或myeclipse中建立工程并导入java连接db2所需要的jar包db2java.jar 下载地址&#xff1a;http://download.csdn.net/detail/whzhaochao/64149813.建立iConn接口&#xff0c;代码如下&#xff1a;package com.zh…