在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息。而客户端却得不到服务器的响应。

在不涉及语言平台的制约,WebService可胜任做这些服务端的处理。

基于大部分业务需求,更需要服务端能够响应处理数据。下面我通过一个demo案例,介绍下Apache thrift 双向通信的使用。

一.首先我们还是需要安装好Apache thrift。这里不再赘述,戳这里查看我上篇文章的介绍:http://www.cnblogs.com/sumingk/articles/6073105.html

二.其次准备好thrift 所需的jar包:

三.新建一个Java web项目,编写thrift脚本,命名为student.thrift  如下:

  1. namespace java com.zhj.student
  2.  
  3. typedef i32 int
  4. typedef i16 short
  5. typedef i64 long
  6.  
  7. //Student Entity
  8. struct Student {
  9. : string name
  10. }
  11.  
  12. service Zthrift {
  13. oneway void send(:Student msg)
  14. }

四.执行student.thrift 文件,thrift  --gen java  student.thrift (该文件我还是放在c盘根目录下执行),随后生产gen-java文件,如下:

五.将新生成的两文件拷入项目中,其中Student.java 是实体类,Zthrift.java是生成的类。

六.编写thrift服务端类。

  1. package com.zhj.server;
  2.  
  3. import org.apache.thrift.TException;
  4. import org.apache.thrift.TProcessor;
  5. import org.apache.thrift.TProcessorFactory;
  6. import org.apache.thrift.protocol.TBinaryProtocol;
  7. import org.apache.thrift.server.TThreadPoolServer;
  8. import org.apache.thrift.transport.TServerSocket;
  9. import org.apache.thrift.transport.TTransport;
  10. import org.apache.thrift.transport.TTransportException;
  11.  
  12. import com.zhj.student.Student;
  13. import com.zhj.student.Zthrift;
  14. import com.zhj.student.Zthrift.Iface;
  15.  
  16. public class ZServer {
  17.  
  18. public static void main(String[] args){
  19. try {
  20. TServerSocket tServerSocket=new TServerSocket(9999);
  21. TThreadPoolServer.Args targs=new TThreadPoolServer.Args(tServerSocket);
  22. TBinaryProtocol.Factory factory=new TBinaryProtocol.Factory();
  23. //获取processFactory
  24. TProcessorFactory tProcessorFactory= getProcessorFactory();
  25. targs.protocolFactory(factory);
  26. targs.processorFactory(tProcessorFactory);
  27. TThreadPoolServer tThreadPoolServer=new TThreadPoolServer(targs);
  28. System.out.println("start server...");
  29. tThreadPoolServer.serve();
  30.  
  31. } catch (TTransportException e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. }
  35.  
  36. }
  37.  
  38. /**
  39. * 内部类获取 getProcessorFactory
  40. * @return
  41. */
  42. public static int tt= 0;
  43. public static TProcessorFactory getProcessorFactory(){
  44.  
  45. TProcessorFactory tProcessorFactory=new TProcessorFactory(null){
  46. public TProcessor getProcessor(final TTransport tTransport){
  47. Thread thread = new Thread(new Runnable() {
  48.  
  49. @Override
  50. public void run() {
  51. try {
  52.  
  53. System.out.println("服务端休眠5秒后,执行响应......");
  54. //延时五秒回复(延迟执行给客户端发送消息)
  55. Thread.sleep(5000);
  56. tt +=100;
  57. System.out.println("延时五秒回复时,tt = " +tt);
  58. //这里可以把client提取作为成员变量来多次使用
  59. Zthrift.Client client = new Zthrift.Client(new TBinaryProtocol(tTransport));
  60. //给客户端响应消息
  61. client.send(new Student("....test"));
  62.  
  63. } catch (InterruptedException e) {
  64. // TODO Auto-generated catch block
  65. e.printStackTrace();
  66. } catch (TException e) {
  67. // TODO Auto-generated catch block
  68. e.printStackTrace();
  69. }
  70. }
  71. });
  72. thread.start();
  73.  
  74. return new Zthrift.Processor<Iface>(new Iface() {
  75.  
  76. @Override
  77. public void send(Student msg) throws TException {
  78. // TODO Auto-generated method stub
  79. tt+=10;
  80. System.out.println("接收客户端消息时,tt = " +tt);
  81. //接受客户端消息
  82. System.out.println("....."+msg.toString());
  83. }
  84. });
  85.  
  86. }
  87. };
  88. return tProcessorFactory;
  89. }
  90. }

此处,内部类使用比较频繁,阅读会有些困难。Zthrift,Processor构造方法需要传入一个Iface 接口,该接口有一个接收客户端的方法send(), msg 是一个Student对象。

七.实现的客户端调用。如下:

  1. package com.zhj.client;
  2.  
  3. import org.apache.thrift.TException;
  4. import org.apache.thrift.protocol.TBinaryProtocol;
  5. import org.apache.thrift.transport.TSocket;
  6. import org.apache.thrift.transport.TTransportException;
  7.  
  8. import com.zhj.student.Student;
  9. import com.zhj.student.Zthrift.Iface;
  10. import com.zhj.student.Zthrift;
  11.  
  12. public class ZClient {
  13.  
  14. public static void main(String[]args){
  15. final TSocket tSocket=new TSocket("127.0.0.1",9999);
  16. Zthrift.Client client=new Zthrift.Client(new TBinaryProtocol(tSocket));
  17. try {
  18. tSocket.open();
  19. runMethod(tSocket);
  20. //向服务端发送消息
  21. client.send(new Student("小明1"));
  22.  
  23. } catch (TTransportException e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. } catch (TException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. }
  30. }
  31.  
  32. public static void runMethod(final TSocket tSocket){
  33. Thread thread = new Thread(new Runnable() {
  34.  
  35. @Override
  36. public void run() {
  37. Zthrift.Processor<Iface> mp = new Zthrift.Processor<Zthrift.Iface>(new Iface() {
  38.  
  39. @Override
  40. public void send(Student msg) throws TException {
  41. // TODO Auto-generated method stub
  42. Long start = System.currentTimeMillis();
  43. try {
  44. while(true){
  45. //具体接收时间待定
  46. if((System.currentTimeMillis()-start)>0.1*60*1000){
  47. System.out.println("响应消息超时...");
  48. break;
  49. }
  50. else {
  51. System.out.println("收到服务端响应消息: "+msg);
  52. }
  53. //休眠两秒
  54. Thread.sleep(2000L);
  55. }
  56. } catch (InterruptedException e) {
  57. // TODO Auto-generated catch block
  58. e.printStackTrace();
  59. }
  60. }
  61.  
  62. });
  63.  
  64. try {
  65. while(mp.process(new TBinaryProtocol(tSocket), new TBinaryProtocol(tSocket))){
  66. //阻塞式方法,不需要内容
  67. System.out.println("走阻塞式方法");
  68. //关闭tScoket
  69. // tSocket.close();
  70. }
  71. } catch (TException e) {
  72. System.out.println("连接已断开...");
  73. e.printStackTrace();
  74. }
  75. }
  76. });
  77. thread.start();
  78. }
  79. }

在这里,我加入了一个超时响应的死循环,用于接收服务端返回的消息,控制台可以查看服务端给的响应消息。

八.运行服务端和客户端main方法,控制台打印如下:

代码阅读有些困难,有困难或不合理之处,请小伙伴指出。Thank you!

Apache thrift RPC 双向通信的更多相关文章

  1. golang高性能RPC:Apache Thrift安装使用完全攻略

    在企业应用中RPC的使用可以说是十分的广泛,使用该技术可以方便的与各种程序交互而不用考虑其编写使用的语言. 如果你对RPC的概念还不太清楚,可以点击这里. 现今市面上已经有许多应用广泛的RPC框架,比 ...

  2. 【Java】分布式RPC通信框架Apache Thrift 使用总结

    简介 Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于th ...

  3. RPC框架实践之:Apache Thrift

    一.概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务.在文章 微服务调用链追踪中心搭建 一文中模拟出来的调 ...

  4. Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架

    本文首先介绍了什么是Apache Thrift,接着介绍了Thrift的安装部署及如何利用Thrift来实现一个简单的RPC应用,并简单的探究了一下Thrift的内部实现原理,最后给出一个基于Thri ...

  5. Apache Thrift 跨语言服务开发框架

    Apache Thrift 是一种支持多种编程语言的远程服务调用框架,由 Facebook 于 2007 年开发,并于 2008 年进入 Apache 开源项目管理.Apache Thrift 通过 ...

  6. Apache Thrift 服务开发框架学习记录

    Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架. 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Servic ...

  7. Apache Thrift学习之一(入门及Java实例演示)

    目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...

  8. 使用Thrift RPC编写程序(服务端和客户端)

    1. Thrift类介绍 Thrift代码包(位于thrift-0.6.1/lib/cpp/src)有以下几个目录: concurrency:并发和时钟管理方面的库processor:Processo ...

  9. Apache Thrift入门(安装、测试与java程序编写)

    安装Apache Thrift ubuntu linux运行: #!/bin/bash #下载 wget http://mirrors.cnnic.cn/apache/thrift/0.9.1/thr ...

随机推荐

  1. 一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino

    大半夜的,先说些废话提提神 如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说 ...

  2. Base64编码

    Base64编码 写在前面 今天在做一个Android app时遇到了一个问题:Android端采用ASE对称加密的数据在JavaWeb(jre1.8.0_7)后台解密时,居然解密失败了!经过测试后发 ...

  3. nodejs创建http服务器

    之前有简单介绍nodejs的一篇文章(http://www.cnblogs.com/fangsmile/p/6226044.html) HTTP服务器 Node内建有一个模块,利用它可以很容易创建基本 ...

  4. JS与APP原生控件交互

    "热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显 ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(76)-微信公众平台开发-网页授权

    前言 网页授权是:应用或者网站请求你用你的微信帐号登录,同意之后第三方应用可以获取你的个人信息 网上说了一大堆参数,实际很难理解和猜透,我们以实际的代码来演示比较通俗易懂 配置 实现之前我们必须配置用 ...

  6. 问题记录:EntityFramework 一对一关系映射

    EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...

  7. PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)

    100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...

  8. css元素水平居中和垂直居中的方式

    关于居中的问题,一直处于疑惑不解的状态,知道的几种方法好像也不是每一次都会起到作用,所以更加迷惑.主要是不清楚该 在什么情况下采用哪种解决方法,所以,整理了一些方法,梳理一下思路,做一个总结. 1. ...

  9. Redis简单案例(二) 网站最近的访问用户

    我们有时会在网站中看到最后的访问用户.最近的活跃用户等等诸如此类的一些信息.本文就以最后的访问用户为例, 用Redis来实现这个小功能.在这之前,我们可以先简单了解一下在oracle.sqlserve ...

  10. Maven 整合FreeMarker使用

    pom.xml <!-- freemarker jar --> <dependency> <groupId>org.freemarker</groupId&g ...