netty学习八:在window上安装thrift以及第一个小demo

原创 2017年08月09日 09:28:37

下载thrift window编译器


需要先下载编译器,本文用的版本是:

thrift-0.10.0.exe

对应的下载链接:thrift编译器

将下载好后的thrift-0.10.0.exe重命名成thrift.exe,并配置到window path路径上,假设thrift.exe是放置在如下目录:

D:\test\software\lib\thrift

那么直接将D:\test\software\lib\thrift配置到path上。

使用cmd命令打开一个窗口,执行:

thrift -version

正常情况下会输出thrift的版本号:

Thrift version 0.10.0


下载thrift java依赖包


<dependency>
    <groupId>org.apache.thrift</groupId>
    <artifactId>libthrift</artifactId>
    <version>0.10.0</version>
</dependency>

使用maven命令下载即可,下载成功后会有四个依赖包:

libthrift-0.10.0.jar
slf4j-api-1.7.12.jar
httpclient-4.4.1.jar
httpcore-4.4.1.jar

下载thrift eclipse 插件


直接使用Eclipse的MarketPlace找不到thrift support这个插件,得使用Eclipse的Install new software的方式。

点击Eclipse的install new software按钮,输入地址

http://thrift4eclipse.sourceforge.net/updatesite/

下载thrift support 插件,这个插件的高亮功能还是相当完备的,建议开发者安装。


编写thrift idl文件


编写animal.thrift

namespace java thrift.generated

typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String

struct Animal {
 1: optional String username,
 2: optional int age,
 3: optional boolean married
}

exception DataException {
 1: optional String message,
 2: optional String callStack,
 3: optional boolean date
}

service AnimalService {
  Animal getAnimalByUsername(1: required String name) throws (1: DataException dataException),
  void saveAnimal(1: required Animal animal) throws (1: DataException dataException)
}

animal.thrift位于:

src/main/java/thrift

完整路径是:

src/main/java/thrift/animal.thrift

其中的

typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String

是做类型定义,因为thrift默认的类型定义不太符合java程序员的使用习惯.


使用thrift编译器生成java类


执行命令:

thrift –gen java src/main/java/thrift/animal.thrift

注意是gen前面是两个-,不是一个- .

执行成功后会生成gen-java目录:

gen-java
   thrift
     generated
       Animal.java
       AnimalService.java
       DataException.java

这些文件不是在java source目录下的,我们可以将其拷贝到source目录下,本文中将其拷贝到如下source目录:

thrift.generated


实现Animal业务层服务类


package thrift.firstdemo;

import org.apache.thrift.TException;

import thrift.generated.Animal;
import thrift.generated.AnimalService;
import thrift.generated.DataException;
/**
 * 业务层服务类 
 *
 */
public class AnimalBizService implements AnimalService.Iface{

    @Override
    public Animal getAnimalByUsername(String name) throws DataException, TException {
        System.out.println("client name:"+name);
        Animal animal = new Animal();
        animal.setUsername(name);
        animal.setAge(34);
        animal.setMarried(true);

        return animal;
    }

    @Override
    public void saveAnimal(Animal animal) throws DataException, TException {
        System.out.println("saveAnimal");
        System.out.println(animal.getUsername());
        System.out.println(animal.getAge());
        System.out.println(animal.isMarried());
    }

}

通常用thrift生成service后,会用一个业务实现类来实现thrift servce接口,完成业务逻辑.


Thrift Server端代码


package thrift.firstdemo;

import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.THsHaServer.Args;
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.generated.AnimalService;
public class ThriftServer {

    public static void main(String[] args) throws TTransportException {
        TNonblockingServerSocket socket = new TNonblockingServerSocket(8899);
        Args arg = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);

        AnimalService.Processor<AnimalBizService> processors = new AnimalService.Processor<>(new AnimalBizService());
        arg.protocolFactory(new TCompactProtocol.Factory());
        arg.transportFactory(new TFramedTransport.Factory());
        arg.processorFactory(new TProcessorFactory(processors));

        TServer server = new THsHaServer(arg);
        server.serve();
    }
}

Thrift Client端代码


package thrift.firstdemo;

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

import thrift.generated.Animal;
import thrift.generated.AnimalService;
import thrift.generated.AnimalService.Client;
import thrift.generated.DataException;

public class ThriftClient {

    public static void main(String[] args) throws DataException, TException {
        TTransport transport = new TFramedTransport(new TSocket("localhost", 8899),600); 
        TCompactProtocol tCompactProtocol = new TCompactProtocol(transport);
        Client client = new AnimalService.Client(tCompactProtocol);

        transport.open();
        Animal animal = client.getAnimalByUsername("sam");
        System.out.println(animal.getUsername());
        System.out.println(animal.getAge());
        System.out.println(animal.isMarried());


        Animal animal2 = new Animal();
        animal2.setUsername("sam2");
        animal2.setAge(35);
        animal2.setMarried(false);
        client.saveAnimal(animal2);
    }
}

运行代码


分别运行ThriftServer类和ThriftClient类的main方法,启动服务端和客户端,正常情况下会打印如下日志:

client name:sam
saveAnimal
sam2
35
false


csdn code 路径


这个项目的源代码放置在csdn code上,欢迎访问。

netty_study

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

thrift的TTransport连接池注意事项[Java版本说明]

使用thrift进行通信,如果采用长连接模式,那么一般做法是基于TTransport的连接池做法。 1.预先对要通信的服务端,创建足够的TTransport实例。 2.在进行通过通信过程中,再从中获取...

Thrift源码系列----3.TProtocol层功能分析

前言        这一章我们来看TProtocol提供了哪些方法,重点介绍方法的功能,不对每个方法的源码实现做细致的分析,由于这一章牵扯到了上一层方法的调用问题,会有些难以理解,更多细节会在下一章详...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Flume架构以及应用介绍

在具体介绍本文内容之前,先给大家看一下Hadoop业务的整体开发流程: 从Hadoop的业务开发流程图中可以看出,在大数据的业务处理过程中,对于数据的采集是十分重要的一步,也是不可避...

thrift之TTransport层的分帧传输类TFramedTransport

帧传输类就是按照一帧的固定大小来传输数据,所有的写操作首先都是在内存中完成的直到调用了flush操作,然后传输节点在flush操作之后将所有数据根据数据的有效载荷写入数据的长度的二进制块发送出去,允许...

Thrift源码系列----2.TTransport层源码分析

概述前言        前几篇博客为大家介绍了Thrift类体系及非阻塞服务模型的框架实现,分析过程中对TTransport、TProtocol的类功能做简单介绍,忽略了实现细节,作者本人对一些细节实...

ubuntu下thrift的安装

一、ubuntu下thrift的安装 1.下载源代码 http://thrift.apache.org/download/ 下载最新版本thrift-0.8.0.tar.gz ...

thrift 基于window的安装配置

thrift是由facebook开发用做系统内各语言之间的RPC通信 。主要特点是可以跨多语言,并且能承受高并发访问。在使用的过程中,跟同为RPC的hessian比较,最令人印象深刻的是,需要定义一个...

thrift学习第二步,一个简单的双向通信demo以及原理讲解,以及注意事项

经过一番研究后,摸清楚了thrift的基本使用方法和其工作原理.thrift的确是封装了java原生Socket,所以从根本上来讲是可以实现双向通信的,正如上一篇文章中翻译的外文中所说的,无需建立双连...

netty学习二:基于socket通讯的小demo

netty socket编程小demo
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)