首页 > 编程语言 >Thrift入门及Java实例演示

Thrift入门及Java实例演示

时间:2023-09-15 13:34:37浏览次数:44  
标签:演示 new Java import apache org Thrift public thrift


目录:

  • 概述
  • 下载配置
  • 基本概念
  1. 数据类型
  2. 服务端编码基本步骤
  3. 客户端编码基本步骤
  4. 数据传输协议

实例演示(java)

  1.  thrift生成代码
  2.  实现接口Iface
  3. TSimpleServer服务模型
  4. TThreadPoolServer 服务模型
  5. TNonblockingServer 服务模型
  6. THsHaServer服务模型
  7. 异步客户端

[一]、概述

Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。

Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

官网地址:thrift.apache.org

推荐值得一看的文章:

[二]、下载配置

到官网下载最新版本,截止今日(2012-06-11)最新版本为0.8.0.

1. 如果是Maven构建项目的,直接在pom.xml 中添加如下内容:

1
 <dependency> 
 
   
2
 <groupId>org.apache.thrift</groupId> 
 
   
3
 <artifactId>libthrift</artifactId> 
 
   
4
 <version>0.8.0</version> 
 
   
5
 </dependency>


2.如果自己编译lib包,把下载的压缩包解压到X:盘,然后在X:\thrift-0.8.0\lib\java 目录下运行ant进行自动编译,会在X:\thrift-0.8.0\lib\java\build\ 目录下看到编译好的lib包:libthrift-0.8.0.jar

[三]、基本概念

1.数据类型

  • 基本类型:
  • bool:布尔值,true 或 false,对应 Java 的 boolean
  • byte:8 位有符号整数,对应 Java 的 byte
  • i16:16 位有符号整数,对应 Java 的 short
  • i32:32 位有符号整数,对应 Java 的 int
  • i64:64 位有符号整数,对应 Java 的 long
  • double:64 位浮点数,对应 Java 的 double
  • string:utf-8编码的字符串,对应 Java 的 String
  • 结构体类型:
  • struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
  • 容器类型:
  • list:对应 Java 的 ArrayList
  • set:对应 Java 的 HashSet
  • map:对应 Java 的 HashMap
  • 异常类型:
  • exception:对应 Java 的 Exception
  • 服务类型:
  • service:对应服务的类

2.服务端编码基本步骤:

  • 实现服务处理接口impl
  • 创建TProcessor
  • 创建TServerTransport
  • 创建TProtocol
  • 创建TServer
  • 启动Server

3.客户端编码基本步骤:

  • 创建Transport
  • 创建TProtocol
  • 基于TTransport和TProtocol创建 Client
  • 调用Client的相应方法

4.数据传输协议

  • TBinaryProtocol : 二进制格式.
  • TCompactProtocol : 压缩格式
  • TJSONProtocol : JSON格式
  • TSimpleJSONProtocol : 提供JSON只写协议, 生成的文件很容易通过脚本语言解析

tips:客户端和服务端的协议要一致

[四]、实例演示

1. thrift生成代码

创建Thrift文件:G:\test\thrift\demoHello.thrift

1
namespace java com.micmiu.thrift.demo
 
   
2
 
 
   
3
service  HelloWorldService {
 
   
4
 string sayHello(1:string username) 
 
   
5
}


目录结构如下:



G:\test\thrift>tree /F 卷 other 的文件夹 PATH 列表 卷序列号为 D238-BE47 G:. demoHello.thrift demouser.thrift thrift-0.8.0.exe 没有子文件夹



thrift-0.8.0.exe



thrift-0.8.0.exe -r -gen java ./demoHello.thrift


生成后的目录结构如下:



G:\test\thrift>tree /F 卷 other 的文件夹 PATH 列表 卷序列号为 D238-BE47 G:. │ demoHello.thrift │ demouser.thrift │ thrift-0.8.0.exe │ └─gen-java └─com └─micmiu └─thrift └─demo HelloWorldService.java



将生成的HelloWorldService.java 文件copy到自己测试的工程中,我的工程是用maven构建的,故在pom.xml中增加如下内容:

1
 <dependency> 
 
   
2
 <groupId>org.apache.thrift</groupId> 
 
   
3
 <artifactId>libthrift</artifactId> 
 
   
4
 <version>0.8.0</version> 
 
   
5
 </dependency> 
 
   
6
 <dependency> 
 
   
7
 <groupId>org.slf4j</groupId> 
 
   
8
 <artifactId>slf4j-log4j12</artifactId> 
 
   
9
 <version>1.5.8</version> 
 
   
10
 </dependency>

2. 实现接口Iface

java代码:HelloWorldImpl.java

1
 package com.micmiu.thrift.demo; 
 
   
2
 
 
   
3
 import org.apache.thrift.TException; 
 
   
4
 
 
   
5
/**
 
   
6
 * blog http://www.micmiu.com 
 
   
7
 * 
 
   
8
 * @author Michael 
 
   
9
 * 
 
   
10
 */ 
 
   
11
 public class HelloWorldImpl implements HelloWorldService.Iface { 
 
   
12
 
 
   
13
 public HelloWorldImpl() { 
 
   
14
 } 
 
   
15
 
 
   
16
 @Override 
 
   
17
 public String sayHello(String username) throws TException { 
 
   
18
 return "Hi," + username + " welcome to my blog www.micmiu.com"; 
 
   
19
 } 
 
   
20
 
 
   
21
}


3.TSimpleServer服务端

简单的单线程服务模型,一般用于测试。

编写服务端server代码:HelloServerDemo.java


1
 package com.micmiu.thrift.demo; 
 
   
2
 
 
   
3
 import org.apache.thrift.TProcessor; 
 
   
4
 import org.apache.thrift.protocol.TBinaryProtocol; 
 
   
5
 import org.apache.thrift.protocol.TCompactProtocol; 
 
   
6
 import org.apache.thrift.protocol.TJSONProtocol; 
 
   
7
 import org.apache.thrift.protocol.TSimpleJSONProtocol; 
 
   
8
 import org.apache.thrift.server.TServer; 
 
   
9
 import org.apache.thrift.server.TSimpleServer; 
 
   
10
 import org.apache.thrift.transport.TServerSocket; 
 
   
11
 
 
   
12
/**
 
   
13
 * blog http://www.micmiu.com 
 
   
14
 * 
 
   
15
 * @author Michael 
 
   
16
 * 
 
   
17
 */ 
 
   
18
 public class HelloServerDemo { 
 
   
19
 public static final int SERVER_PORT = 8090; 
 
   
20
 
 
   
21
 public void startServer() { 
 
   
22
 try { 
 
   
23
 System.out.println("HelloWorld TSimpleServer start ...."); 
 
   
24
 
 
   
25
 TProcessor tprocessor = newHelloWorldService.Processor<HelloWorldService.Iface>( 
 
   
26
 new HelloWorldImpl()); 
 
   
27
 // HelloWorldService.Processor<HelloWorldService.Iface> tprocessor = 
 
   
28
 // new HelloWorldService.Processor<HelloWorldService.Iface>( 
 
   
29
 // new HelloWorldImpl()); 
 
   
30
 
 
   
31
 // 简单的单线程服务模型,一般用于测试 
 
   
32
 TServerSocket serverTransport = newTServerSocket(SERVER_PORT); 
 
   
33
 TServer.Args tArgs = new TServer.Args(serverTransport); 
 
   
34
 tArgs.processor(tprocessor); 
 
   
35
 tArgs.protocolFactory(new TBinaryProtocol.Factory()); 
 
   
36
 // tArgs.protocolFactory(new TCompactProtocol.Factory()); 
 
   
37
 // tArgs.protocolFactory(new TJSONProtocol.Factory()); 
 
   
38
 TServer server = new TSimpleServer(tArgs); 
 
   
39
 server.serve(); 
 
   
40
 
 
   
41
 } catch (Exception e) { 
 
   
42
 System.out.println("Server start error!!!"); 
 
   
43
 e.printStackTrace(); 
 
   
44
 } 
 
   
45
 } 
 
   
46
 
 
   
47
 /** 
 
   
48
 * @param args 
 
   
49
 */ 
 
   
50
 public static void main(String[] args) { 
 
   
51
 HelloServerDemo server = new HelloServerDemo(); 
 
   
52
 server.startServer(); 
 
   
53
 } 
 
   
54
 
 
   
55
}

编写客户端Client代码:HelloClientDemo.java

1
 package com.micmiu.thrift.demo; 
 
   
2
 
 
   
3
 import org.apache.thrift.TException; 
 
   
4
 import org.apache.thrift.protocol.TBinaryProtocol; 
 
   
5
 import org.apache.thrift.protocol.TCompactProtocol; 
 
   
6
 import org.apache.thrift.protocol.TJSONProtocol; 
 
   
7
 import org.apache.thrift.protocol.TProtocol; 
 
   
8
 import org.apache.thrift.transport.TSocket; 
 
   
9
 import org.apache.thrift.transport.TTransport; 
 
   
10
 import org.apache.thrift.transport.TTransportException; 
 
   
11
 
 
   
12
/**
 
   
13
 * blog http://www.micmiu.com 
 
   
14
 * 
 
   
15
 * @author Michael 
 
   
16
 * 
 
   
17
 */ 
 
   
18
 public class HelloClientDemo { 
 
   
19
 
 
   
20
 public static final String SERVER_IP = "localhost"; 
 
   
21
 public static final int SERVER_PORT = 8090; 
 
   
22
 public static final int TIMEOUT = 30000; 
 
   
23
 
 
   
24
 /** 
 
   
25
 * 
 
   
26
 * @param userName 
 
   
27
 */ 
 
   
28
 public void startClient(String userName) { 
 
   
29
 TTransport transport = null; 
 
   
30
 try { 
 
   
31
 transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT); 
 
   
32
 // 协议要和服务端一致 
 
   
33
 TProtocol protocol = new TBinaryProtocol(transport); 
 
   
34
 // TProtocol protocol = new TCompactProtocol(transport); 
 
   
35
 // TProtocol protocol = new TJSONProtocol(transport); 
 
   
36
 HelloWorldService.Client client = newHelloWorldService.Client( 
 
   
37
 protocol); 
 
   
38
 transport.open(); 
 
   
39
 String result = client.sayHello(userName); 
 
   
40
 System.out.println("Thrify client result =: " + result); 
 
   
41
 } catch (TTransportException e) { 
 
   
42
 e.printStackTrace(); 
 
   
43
 } catch (TException e) { 
 
   
44
 e.printStackTrace(); 
 
   
45
 } finally { 
 
   
46
 if (null != transport) { 
 
   
47
 transport.close(); 
 
   
48
 } 
 
   
49
 } 
 
   
50
 } 
 
   
51
 
 
   
52
 /** 
 
   
53
 * @param args 
 
   
54
 */ 
 
   
55
 public static void main(String[] args) { 
 
   
56
 HelloClientDemo client = new HelloClientDemo(); 
 
   
57
 client.startClient("Michael"); 
 
   
58
 
 
   
59
 } 
 
   
60
 
 
   
61
}

先运行服务端程序,日志如下:



HelloWorld TSimpleServer start ....



再运行客户端调用程序,日志如下:



Thrify client result =: Hi,Michael welcome to my blog www.micmiu.com



测试成功,和预期的返回信息一致。

4.TThreadPoolServer 服务模型

线程池服务模型,使用标准的阻塞式IO,预先创建一组线程处理请求。

编写服务端代码:HelloServerDemo.java


1
 package com.micmiu.thrift.demo; 
 
   
2
 
 
   
3
 import org.apache.thrift.TProcessor; 
 
   
4
 import org.apache.thrift.protocol.TBinaryProtocol; 
 
   
5
 import org.apache.thrift.server.TServer; 
 
   
6
 import org.apache.thrift.server.TThreadPoolServer; 
 
   
7
 import org.apache.thrift.transport.TServerSocket; 
 
   
8
 
 
   
9
/**
 
   
10
 * blog http://www.micmiu.com 
 
   
11
 * 
 
   
12
 * @author Michael 
 
   
13
 * 
 
   
14
 */ 
 
   
15
 public class HelloServerDemo { 
 
   
16
 public static final int SERVER_PORT = 8090; 
 
   
17
 
 
   
18
 public void startServer() { 
 
   
19
 try { 
 
   
20
 System.out.println("HelloWorld TThreadPoolServer start ...."); 
 
   
21
 
 
   
22
 TProcessor tprocessor = newHelloWorldService.Processor<HelloWorldService.Iface>( 
 
   
23
 new HelloWorldImpl()); 
 
   
24
 
 
   
25
 TServerSocket serverTransport = newTServerSocket(SERVER_PORT); 
 
   
26
 TThreadPoolServer.Args ttpsArgs = newTThreadPoolServer.Args( 
 
   
27
 serverTransport); 
 
   
28
 ttpsArgs.processor(tprocessor); 
 
   
29
 ttpsArgs.protocolFactory(new TBinaryProtocol.Factory()); 
 
   
30
 
 
   
31
 // 线程池服务模型,使用标准的阻塞式IO,预先创建一组线程处理请求。 
 
   
32
 TServer server = new TThreadPoolServer(ttpsArgs); 
 
   
33
 server.serve(); 
 
   
34
 
 
   
35
 } catch (Exception e) { 
 
   
36
 System.out.println("Server start error!!!"); 
 
   
37
 e.printStackTrace(); 
 
   
38
 } 
 
   
39
 } 
 
   
40
 
 
   
41
 /** 
 
   
42
 * @param args 
 
   
43
 */ 
 
   
44
 public static void main(String[] args) { 
 
   
45
 HelloServerDemo server = new HelloServerDemo(); 
 
   
46
 server.startServer(); 
 
   
47
 } 
 
   
48
 
 
   
49
}

客户端Client代码和之前的一样,只要数据传输的协议一致即可,客户端测试成功,结果如下:



Thrify client result =: Hi,Michael welcome to my blog www.micmiu.com



5.TNonblockingServer 服务模型

使用非阻塞式IO,服务端和客户端需要指定 TFramedTransport

编写服务端代码:HelloServerDemo.java

1
 package com.micmiu.thrift.demo; 
 
   
2
 
 
   
3
 import org.apache.thrift.TProcessor; 
 
   
4
 import org.apache.thrift.protocol.TCompactProtocol; 
 
   
5
 import org.apache.thrift.server.TNonblockingServer; 
 
   
6
 import org.apache.thrift.server.TServer; 
 
   
7
 import org.apache.thrift.transport.TFramedTransport; 
 
   
8
 import org.apache.thrift.transport.TNonblockingServerSocket; 
 
   
9
 
 
   
10
/**
 
   
11
 * blog http://www.micmiu.com 
 
   
12
 * 
 
   
13
 * @author Michael 
 
   
14
 * 
 
   
15
 */ 
 
   
16
 public class HelloServerDemo { 
 
   
17
 public static final int SERVER_PORT = 8090; 
 
   
18
 
 
   
19
 public void startServer() { 
 
   
20
 try { 
 
   
21
 System.out.println("HelloWorld TNonblockingServer start ...."); 
 
   
22
 
 
   
23
 TProcessor tprocessor = newHelloWorldService.Processor<HelloWorldService.Iface>( 
 
   
24
 new HelloWorldImpl()); 
 
   
25
 
 
   
26
 TNonblockingServerSocket tnbSocketTransport = newTNonblockingServerSocket( 
 
   
27
 SERVER_PORT); 
 
   
28
 TNonblockingServer.Args tnbArgs = newTNonblockingServer.Args( 
 
   
29
 tnbSocketTransport); 
 
   
30
 tnbArgs.processor(tprocessor); 
 
   
31
 tnbArgs.transportFactory(new TFramedTransport.Factory()); 
 
   
32
 tnbArgs.protocolFactory(new TCompactProtocol.Factory()); 
 
   
33
 
 
   
34
 // 使用非阻塞式IO,服务端和客户端需要指定TFramedTransport数据传输的方式 
 
   
35
 TServer server = new TNonblockingServer(tnbArgs); 
 
   
36
 server.serve(); 
 
   
37
 
 
   
38
 } catch (Exception e) { 
 
   
39
 System.out.println("Server start error!!!"); 
 
   
40
 e.printStackTrace(); 
 
   
41
 } 
 
   
42
 } 
 
   
43
 
 
   
44
 /** 
 
   
45
 * @param args 
 
   
46
 */ 
 
   
47
 public static void main(String[] args) { 
 
   
48
 HelloServerDemo server = new HelloServerDemo(); 
 
   
49
 server.startServer(); 
 
   
50
 } 
 
   
51
 
 
   
52
}


编写客户端代码:HelloClientDemo.java


1
 package com.micmiu.thrift.demo; 
 
   
2
 
 
   
3
 import org.apache.thrift.TException; 
 
   
4
 import org.apache.thrift.protocol.TCompactProtocol; 
 
   
5
 import org.apache.thrift.protocol.TProtocol; 
 
   
6
 import org.apache.thrift.transport.TFramedTransport; 
 
   
7
 import org.apache.thrift.transport.TSocket; 
 
   
8
 import org.apache.thrift.transport.TTransport; 
 
   
9
 import org.apache.thrift.transport.TTransportException; 
 
   
10
 
 
   
11
/**
 
   
12
 * blog http://www.micmiu.com 
 
   
13
 * 
 
   
14
 * @author Michael 
 
   
15
 * 
 
   
16
 */ 
 
   
17
 public class HelloClientDemo { 
 
   
18
 
 
   
19
 public static final String SERVER_IP = "localhost"; 
 
   
20
 public static final int SERVER_PORT = 8090; 
 
   
21
 public static final int TIMEOUT = 30000; 
 
   
22
 
 
   
23
 /** 
 
   
24
 * 
 
   
25
 * @param userName 
 
   
26
 */ 
 
   
27
 public void startClient(String userName) { 
 
   
28
 TTransport transport = null; 
 
   
29
 try { 
 
   
30
 transport = new TFramedTransport(new TSocket(SERVER_IP, 
 
   
31
 SERVER_PORT, TIMEOUT)); 
 
   
32
 // 协议要和服务端一致 
 
   
33
 TProtocol protocol = new TCompactProtocol(transport); 
 
   
34
 HelloWorldService.Client client = newHelloWorldService.Client( 
 
   
35
 protocol); 
 
   
36
 transport.open(); 
 
   
37
 String result = client.sayHello(userName); 
 
   
38
 System.out.println("Thrify client result =: " + result); 
 
   
39
 } catch (TTransportException e) { 
 
   
40
 e.printStackTrace(); 
 
   
41
 } catch (TException e) { 
 
   
42
 e.printStackTrace(); 
 
   
43
 } finally { 
 
   
44
 if (null != transport) { 
 
   
45
 transport.close(); 
 
   
46
 } 
 
   
47
 } 
 
   
48
 } 
 
   
49
 
 
   
50
 /** 
 
   
51
 * @param args 
 
   
52
 */ 
 
   
53
 public static void main(String[] args) { 
 
   
54
 HelloClientDemo client = new HelloClientDemo(); 
 
   
55
 client.startClient("Michael"); 
 
   
56
 
 
   
57
 } 
 
   
58
 
 
   
59
}

客户端的测试成功,结果如下:



Thrify client result =: Hi,Michael welcome to my blog www.micmiu.com



6.THsHaServer服务模型

半同步半异步的服务端模型,需要指定为: TFramedTransport

编写服务端代码:HelloServerDemo.java

1
 package com.micmiu.thrift.demo; 
 
   
2
 
 
   
3
 import org.apache.thrift.TProcessor; 
 
   
4
 import org.apache.thrift.protocol.TBinaryProtocol; 
 
   
5
 import org.apache.thrift.protocol.TCompactProtocol; 
 
   
6
 import org.apache.thrift.server.THsHaServer; 
 
   
7
 import org.apache.thrift.server.TNonblockingServer; 
 
   
8
 import org.apache.thrift.server.TServer; 
 
   
9
 import org.apache.thrift.server.TSimpleServer; 
 
   
10
 import org.apache.thrift.server.TThreadPoolServer; 
 
   
11
 import org.apache.thrift.transport.TFramedTransport; 
 
   
12
 import org.apache.thrift.transport.TNonblockingServerSocket; 
 
   
13
 import org.apache.thrift.transport.TServerSocket; 
 
   
14
 
 
   
15
/**
 
   
16
 * blog http://www.micmiu.com 
 
   
17
 * 
 
   
18
 * @author Michael 
 
   
19
 * 
 
   
20
 */ 
 
   
21
 public class HelloServerDemo { 
 
   
22
 public static final int SERVER_PORT = 8090; 
 
   
23
 
 
   
24
 public void startServer() { 
 
   
25
 try { 
 
   
26
 System.out.println("HelloWorld THsHaServer start ...."); 
 
   
27
 
 
   
28
 TProcessor tprocessor = newHelloWorldService.Processor<HelloWorldService.Iface>( 
 
   
29
 new HelloWorldImpl()); 
 
   
30
 
 
   
31
 TNonblockingServerSocket tnbSocketTransport = newTNonblockingServerSocket( 
 
   
32
 SERVER_PORT); 
 
   
33
 THsHaServer.Args thhsArgs = newTHsHaServer.Args(tnbSocketTransport); 
 
   
34
 thhsArgs.processor(tprocessor); 
 
   
35
 thhsArgs.transportFactory(new TFramedTransport.Factory()); 
 
   
36
 thhsArgs.protocolFactory(new TBinaryProtocol.Factory()); 
 
   
37
 
 
   
38
 //半同步半异步的服务模型 
 
   
39
 TServer server = new THsHaServer(thhsArgs); 
 
   
40
 server.serve(); 
 
   
41
 
 
   
42
 } catch (Exception e) { 
 
   
43
 System.out.println("Server start error!!!"); 
 
   
44
 e.printStackTrace(); 
 
   
45
 } 
 
   
46
 } 
 
   
47
 
 
   
48
 /** 
 
   
49
 * @param args 
 
   
50
 */ 
 
   
51
 public static void main(String[] args) { 
 
   
52
 HelloServerDemo server = new HelloServerDemo(); 
 
   
53
 server.startServer(); 
 
   
54
 } 
 
   
55
 
 
   
56
}

客户端代码和上面 4 中的类似,只要注意传输协议一致以及指定传输方式为TFramedTransport。

7.异步客户端

编写服务端代码:HelloServerDemo.java

1
 package com.micmiu.thrift.demo; 
 
   
2
 
 
   
3
 import org.apache.thrift.TProcessor; 
 
   
4
 import org.apache.thrift.protocol.TCompactProtocol; 
 
   
5
 import org.apache.thrift.server.TNonblockingServer; 
 
   
6
 import org.apache.thrift.server.TServer; 
 
   
7
 import org.apache.thrift.transport.TFramedTransport; 
 
   
8
 import org.apache.thrift.transport.TNonblockingServerSocket; 
 
   
9
 
 
   
10
/**
 
   
11
 * blog http://www.micmiu.com 
 
   
12
 * 
 
   
13
 * @author Michael 
 
   
14
 * 
 
   
15
 */ 
 
   
16
 public class HelloServerDemo { 
 
   
17
 public static final int SERVER_PORT = 8090; 
 
   
18
 
 
   
19
 public void startServer() { 
 
   
20
 try { 
 
   
21
 System.out.println("HelloWorld TNonblockingServer start ...."); 
 
   
22
 
 
   
23
 TProcessor tprocessor = newHelloWorldService.Processor<HelloWorldService.Iface>( 
 
   
24
 new HelloWorldImpl()); 
 
   
25
 
 
   
26
 TNonblockingServerSocket tnbSocketTransport = newTNonblockingServerSocket( 
 
   
27
 SERVER_PORT); 
 
   
28
 TNonblockingServer.Args tnbArgs = newTNonblockingServer.Args( 
 
   
29
 tnbSocketTransport); 
 
   
30
 tnbArgs.processor(tprocessor); 
 
   
31
 tnbArgs.transportFactory(new TFramedTransport.Factory()); 
 
   
32
 tnbArgs.protocolFactory(new TCompactProtocol.Factory()); 
 
   
33
 
 
   
34
 // 使用非阻塞式IO,服务端和客户端需要指定TFramedTransport数据传输的方式 
 
   
35
 TServer server = new TNonblockingServer(tnbArgs); 
 
   
36
 server.serve(); 
 
   
37
 
 
   
38
 } catch (Exception e) { 
 
   
39
 System.out.println("Server start error!!!"); 
 
   
40
 e.printStackTrace(); 
 
   
41
 } 
 
   
42
 } 
 
   
43
 
 
   
44
 /** 
 
   
45
 * @param args 
 
   
46
 */ 
 
   
47
 public static void main(String[] args) { 
 
   
48
 HelloServerDemo server = new HelloServerDemo(); 
 
   
49
 server.startServer(); 
 
   
50
 } 
 
   
51
 
 
   
52
}

编写客户端Client代码:HelloAsynClientDemo.java


1
 package com.micmiu.thrift.demo; 
 
   
2
 
 
   
3
 import java.util.concurrent.CountDownLatch; 
 
   
4
 import java.util.concurrent.TimeUnit; 
 
   
5
 
 
   
6
 import org.apache.thrift.TException; 
 
   
7
 import org.apache.thrift.async.AsyncMethodCallback; 
 
   
8
 import org.apache.thrift.async.TAsyncClientManager; 
 
   
9
 import org.apache.thrift.protocol.TCompactProtocol; 
 
   
10
 import org.apache.thrift.protocol.TProtocolFactory; 
 
   
11
 import org.apache.thrift.transport.TNonblockingSocket; 
 
   
12
 import org.apache.thrift.transport.TNonblockingTransport; 
 
   
13
 
 
   
14
 importcom.micmiu.thrift.demo.HelloWorldService.AsyncClient.sayHello_call; 
 
   
15
 
 
   
16
/**
 
   
17
 * blog http://www.micmiu.com 
 
   
18
 * 
 
   
19
 * @author Michael 
 
   
20
 * 
 
   
21
 */ 
 
   
22
 public class HelloAsynClientDemo { 
 
   
23
 
 
   
24
 public static final String SERVER_IP = "localhost"; 
 
   
25
 public static final int SERVER_PORT = 8090; 
 
   
26
 public static final int TIMEOUT = 30000; 
 
   
27
 
 
   
28
 /** 
 
   
29
 * 
 
   
30
 * @param userName 
 
   
31
 */ 
 
   
32
 public void startClient(String userName) { 
 
   
33
 try { 
 
   
34
 TAsyncClientManager clientManager = newTAsyncClientManager(); 
 
   
35
 TNonblockingTransport transport = newTNonblockingSocket(SERVER_IP, 
 
   
36
 SERVER_PORT, TIMEOUT); 
 
   
37
 
 
   
38
 TProtocolFactory tprotocol = newTCompactProtocol.Factory(); 
 
   
39
 HelloWorldService.AsyncClient asyncClient = newHelloWorldService.AsyncClient( 
 
   
40
 tprotocol, clientManager, transport); 
 
   
41
 System.out.println("Client start ....."); 
 
   
42
 
 
   
43
 CountDownLatch latch = new CountDownLatch(1); 
 
   
44
 AsynCallback callBack = new AsynCallback(latch); 
 
   
45
 System.out.println("call method sayHello start ..."); 
 
   
46
 asyncClient.sayHello(userName, callBack); 
 
   
47
 System.out.println("call method sayHello .... end"); 
 
   
48
 boolean wait = latch.await(30, TimeUnit.SECONDS); 
 
   
49
 System.out.println("latch.await =:" + wait); 
 
   
50
 } catch (Exception e) { 
 
   
51
 e.printStackTrace(); 
 
   
52
 } 
 
   
53
 System.out.println("startClient end."); 
 
   
54
 } 
 
   
55
 
 
   
56
 public class AsynCallback implementsAsyncMethodCallback<sayHello_call> { 
 
   
57
 private CountDownLatch latch; 
 
   
58
 
 
   
59
 public AsynCallback(CountDownLatch latch) { 
 
   
60
 this.latch = latch; 
 
   
61
 } 
 
   
62
 
 
   
63
 @Override 
 
   
64
 public void onComplete(sayHello_call response) { 
 
   
65
 System.out.println("onComplete"); 
 
   
66
 try { 
 
   
67
 // Thread.sleep(1000L * 1); 
 
   
68
 System.out.println("AsynCall result =:" 
 
   
69
 + response.getResult().toString()); 
 
   
70
 } catch (TException e) { 
 
   
71
 e.printStackTrace(); 
 
   
72
 } catch (Exception e) { 
 
   
73
 e.printStackTrace(); 
 
   
74
 } finally { 
 
   
75
 latch.countDown(); 
 
   
76
 } 
 
   
77
 } 
 
   
78
 
 
   
79
 @Override 
 
   
80
 public void one rror(Exception exception) { 
 
   
81
 System.out.println("onError :" + exception.getMessage()); 
 
   
82
 latch.countDown(); 
 
   
83
 } 
 
   
84
 } 
 
   
85
 
 
   
86
 /** 
 
   
87
 * @param args 
 
   
88
 */ 
 
   
89
 public static void main(String[] args) { 
 
   
90
 HelloAsynClientDemo client = new HelloAsynClientDemo(); 
 
   
91
 client.startClient("Michael"); 
 
   
92
 
 
   
93
 } 
 
   
94
 
 
   
95
}


先运行服务程序,再运行客户端程序,测试结果如下:



Client start .....
call method sayHello start ...
call method sayHello .... end
onComplete
AsynCall result =:Hi,Michael welcome to my blog www.micmiu.com
latch.await =:true
startClient end.



————

标签:演示,new,Java,import,apache,org,Thrift,public,thrift
From: https://blog.51cto.com/u_2650279/7480018

相关文章

  • Java
    1.CMDwindows不区分大小写符号必须是英文打开CMDWIN+R:CMD回车切换到E盘E:回车查看当前路径下内容dir进入目录cd目录上一级目录..清屏cls回到盘符根目录cd\qq.exe设置环境变量path添加qq路径jdk(javadevelopmentkit)java开发工具包b......
  • 无涯教程-JavaScript - ADDRESS函数
    描述给定指定的行号和列号,您可以使用ADDRESS函数获取工作表中单元格的地址。如,ADDRESS(2,3)返回$C$2。再举一个Example,ADDRESS(77,300)返回$KN$77。您可以使用其他函数(如ROW和COLUMN函数)为ADDRESS函数提供行号和列号参数。语法ADDRESS(row_num,column_num,[abs_nu......
  • Java面向对象编程
    今天开始面向对象了面向对象基础类:由属性和行为组成属性:在类中通过成员变量来体现行为:在类中通过成员方法来体现publicclass类名{//成员变量变量1的数据类型变量1;变量2的数据类型变量2;......
  • 3.4 Java赋值运算符(=)
    赋值运算符是指为变量或常量指定数值的符号。赋值运算符的符号为“=”,它是双目运算符,左边的操作数必须是变量,不能是常量或表达式。其语法格式如下所示:变量名称=表达式内容在 Java 语言中,“变量名称”和“表达式”内容的类型必须匹配,如果类型不匹配则需要自动转化为对应的类型......
  • 3.5 Java关系运算符
    关系运算符(relationaloperators)也可以称为“比较运算符”,用于用来比较判断两个变量或常量的大小。关系运算符是二元运算符,运算结果是boolean型。当运算符对应的关系成立时,运算结果是true,否则是false。关系表达式是由关系运算符连接起来的表达式。关系运算符中“关系”二字的......
  • 3.6 Java逻辑运算符(&&、||和!)
    逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,判断的结果是true或false。逻辑运算符是对布尔型变量进行运算,其结果也是布尔型,具体如表1所示。表1逻辑运算符的用法、含义及实例运算符用法含义说明实例结果&&a&&b短......
  • 3.8 Java自增和自减运算符(++和--)
    在对一个变量做加1或减1处理时,可以使用自增运算符++或自减运算--。++或--是单目运算符,放在操作数的前面或后面都是允许的。++与--的作用是使变量的值增1或减1。操作数必须是一个整型或浮点型变量。自增、自减运算的含义及其使用实例如表1所示。表1自增、自减......
  • 3.9 Java位运算符:Java移位运算符、复合位赋值运算符及位逻辑运算符
    Java 定义的位运算(bitwiseoperators)直接对整数类型的位进行操作,这些整数类型包括long,int,short,char和byte。位运算符主要用来对操作数二进制的位进行运算。按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值。Java语言中的位运算符分为位逻辑运算符和位移......
  • 3.10 Java三目运算符(条件运算符? :)
    Java 提供了一个特别的三元运算符(也叫三目运算符)经常用于取代某个类型的if-then-else语句。条件运算符的符号表示为“?:”,使用该运算符时需要有三个操作数,因此称其为三目运算符。使用条件运算符的一般语法结构为:result=<expression>?<statement1>:<statement3>;其......
  • 3.12 Java直接量(字面量)
    直接量是指在程序中通过源代码直接给出的值,例如在inta=5;代码中,为变量a所分配的初始值5就是一个直接量。直接量的类型并不是所有的数据类型都可以指定直接量,能指定直接量的通常只有三种类型:基本类型、字符串类型和null类型。具体而言,Java 支持如下8种类型的直接量......