日期:2014-05-17  浏览次数:20860 次

Apache Thrift入门2-Java代码实现例子

在上一篇文章中提到了Thrift的架构、传输协议(Ref),本篇文章将对Thrift的入门实例进行介绍。 分为如下5个部分: 运行环境、安装/配置、脚本文件、创建代码、运行程序。

一、开发环境(清单1)
1.操作系统
?? ?Server-Linux / Client-WinXP
2.SDK
?? ?Sun JDK1.5+

3.需要的jar依赖包
?? ?libthrift.jar
?? ?slf4j-api-1.5.8.jar
?? ?slf4j-log4j12-1.5.8.jar
?? ?log4j-1.2.15.jar

4.编译工具
?? ?Apache Ant? & Apache ivy

二、安装/配置 (清单2)
?? ?1.下载thrift源文件
?? ??? ?http://labs.renren.com/apache-mirror//incubator/thrift/0.5.0-incubating/thrift-0.5.0.tar.gz
?? ??? ?
?? ?2.编译thrift源文件
?? ??? ?1)解压 thrift-0.5.0.tar.gz
?? ??? ?2)用ant编译源代码,进入x:\thrift-0.5.0\lib\java目录,执行ant,通过ant中的ivy工具会自动从站点下载所需要的依赖包,编译完成后如图所示:
??? ? ?? /img/2012/06/24/0832223422.png
?? ???? 3)编译过程中下载的依赖包在x:\thrift-0.5.0\lib\java\build\ivy\lib 目录下可以看见下载的jar依赖包,将编译成功以后的jar包加入Eclipse的开发环境中。

三、脚本文件(清单3)
?? ?1.创建脚本
?? ??? ?创建脚本文件 testJava.thrift ,脚本文件内容如下:
?? ??? ?namespace java com.javabloger.gen.code?? # 注释1?? 定义生成代码的命名空间,与你需要定义的package相对应。

?? ??? ?struct Blog {?? #? 注释2.1?? 定义实体名称和数据结构,类似你业务逻辑中的pojo get/set
?? ??? ??? ?1: string topic???? #? 注释2.2? 参数类型可以参见 Thrift wiki??
?? ??? ??? ?2: binary content ?
?? ??? ??? ?3: i64??? createdTime
?? ??? ??? ?4: string id
?? ??? ??? ?5: string ipAddress
?? ??? ??? ?6: map<string,string> props
?? ??? ?? }
?? ???? service ThriftCase {? #? 注释3??? 代码生成的类名,你的业务逻辑代码需要实现代码生成的ThriftCase.Iface接口
?? ??? ???? i32 testCase1(1:i32 num1, 2:i32 num2, 3:string? num3) #注释4.1 方法名称和方法中的入参,入参类型参见wiki
?? ??? ???? list<string> testCase2(1:map<string,string>? num1)
?? ??? ???? void testCase3()
?? ??? ???? void testCase4(1:list<Blog> blog)?? #? 注释4.2?? list 是thrift中基本数据类型中的一种,list中包含的Blog对象是上面struct中定义的
?? ??? ?}

??? 2.运行脚本
?? ??? ?1)从 thrift 站点下载windows版本的编译工具,下载地址:http://labs.renren.com/apache-mirror//incubator/thrift/0.5.0-incubating/thrift-0.5.0.exe
?? ??? ?2)通过Thrift的脚本文件,运行 thrift 命令创建生成的代码,例如:执行 thrift -gen java x:\testJava.thrift? 命令,在当前运行的盘符下,可看见gen-java目录,在这里目录中可以看见生成的java代码,更多thrift 命令内容,请参见thrift命令自带的help。

3.Thrift 中的基本数据类型 (清单4)
??? 类型 描述
??? bool true, false
??? byte 8位的有符号整数
??? i16 16位的有符号整数
??? i32 32位的有符号整数
??? i64 64位的有符号整数
??? double 64位的浮点数
??? string UTF-8编码的字符串
??? binary 字符数组
??? struct 结构体
??? list 有序的元素列表,类似于STL的vector
??? set 无序的不重复元素集,类似于STL的set
??? map key-value型的映射,类似于STL的map
??? exception 是一个继承于本地语言的exception基类
??? service 服务。包含多个函数接口(纯虚函数)

?

四、创建代码(清单5)
?? ?我将示例工程分了4个包,如下所示:
?? ? \com\javabloger
?? ??? ??? ?\client?? ??? ??????? # 1.客户端测试代码
?? ??? ??? ?\gen\code????????????? # 2.通过脚本生成的class
?? ??? ??? ?\layer\transport?????? # 3.服务器端代码和定义的传输协议
?? ??? ??? ?\layer\business????? # 4.具体的业务逻辑代码
?? ?具体代码内容这里就不阐述了,重点是要明白代