Apache Thrift - java开发教程

1.开发所需要的jar包:

        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.9.0</version>
        </dependency>
 
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.12</version>
        </dependency

2. 安装Thrift环境:

安装thrift:到thrift官网下载exe文件,然后将文件重命名为thrift.exe,拷贝到c:\windows目录下(或者任何目录下),然后就可以在dos环境下使用了

c:\windows>thrift -gen java D:\mywork\javaProject\thriftTest\hello.thrift ,输出的java文件默认输出到当前目录下c:\windows,也可以使用-o参数指定输出路径


3.编写thrift 接口文件:

 namespace java com.wolong.thrift
 
 service Hello{
            string helloString(1:string para)
            i32 helloInt(1:i32 para)
            bool helloBoolean(1:bool para)
            void helloVoid()
            string helloNull()
          }


4.生成代码:

在wondows cmd中,切换到thrift.exe所在目录,运行一下代码:

thrift -o <output directory> -gen java Hello.thrift
注意:.thrift文件要与thrift.exe放在同一目录下
完成后在指定目录下会生成一个目录gen-java,里面有Hello.java。


5.创建工程:

打开Eclipse或者Myeclipse,创建一个Java工程:导入刚才生成的Hello.java文件。


5.1  编写HelloServiceImpl 接口,接口实现Thrift定义文件中的服务。

import org.apache.thrift.TException;
public class HelloServiceImpl implements Hello.Iface{
    public boolean helloBoolean(boolean para) throws TException{
        return para;
    }
    public int helloInt(int para) throws TException{
        try {
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return para;
    }
    
    public String helloNull() throws TException{
        return null;
    }
    
    public String helloString(String para) throws TException{
        return para;
    }
    
    public void helloVoid() throws TException{
        System.out.println("Hello World!");
    }
}


5.2 编写服务器端

import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportException;

public class HelloServiceServer {
    /**
     * 启动thrift服务器
     * @param args
     */
    public static void main(String[] args) {        
        try{
        //设置服务器端口为7911
        TServerSocket serverTransport = new TServerSocket(7911);
        //设置协议工厂为TBinaryProtocol.Factory
        Factory proFactory = new TBinaryProtocol.Factory();
        //关联处理器与Hello服务的实现
        TProcessor processor = new Hello.Processor<Hello.Iface>(new HelloServiceImpl());
        TServer.Args tArgs = new TServer.Args(serverTransport);
        tArgs.processor(processor);
        tArgs.protocolFactory(proFactory);
        //使用TSimpleServer
        TServer server = new TSimpleServer(tArgs);
        System.out.println("Start server on port 7911....");
        server.serve();
        }catch(TTransportException e){
            e.printStackTrace();
        }        
    }

}

5.3 编写客户端

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

public class HelloServiceClient {
    /**
     * 调用Hello服务
     * @param args
     */
    public static void main(String[] args) {                
        try {
            //设置调用的服务器为本地,端口为7911
            TTransport transport = new TSocket("localhost", 7911);
            transport.open();
            //设置传输协议为TBinaryProtocol
            TProtocol protocol = new TBinaryProtocol(transport);
            Hello.Client client = new Hello.Client(protocol);
            client.helloVoid();
            transport.close();
            
        } catch (TTransportException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

5.4 运行结果

先运行服务器端,再运行客户端;

结果:Start server on port 7911....                      

Hello World!


二 : 服务模型实例演示(java)

 注:Hello.java  /  HelloServiceImpl.java 见上生成的代码;

2.1  TSimpleServer服务端:单线程服务器端使用标准的阻塞式 I/O,简单的单线程服务模型

2.2  TThreadPoolServer 服务模型:线程池服务模型(多线程服务器端使用标准的阻塞式I/O),使用标准的阻塞式IO,预先创建一组线程处理请求

2.3  TNonblockingServer 服务模型/多线程服务器端使用非阻塞式 I/O :使用非阻塞式IO,服务端和客户端需要指定 TFramedTransport 数据传输的方式。

2.4  THsHaServer 服务模型:半同步半异步的服务端模型,需要指定为: TFramedTransport 数据传输的方式。

2.5  AsynClient 异步客户端



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值