Thrift 简单demo之list

2017-04-21  本文已影响442人  大龄程序员在帝都

需求:
两个Java进程之间进行通讯,客户端和服务器端,客户端发送List<RTPFile>这个消息到另外一个服务器,另外一个服务器,接收到消息后进行处理

一、首先定义IDL
如何定义IDL,这个语法结构,可以查看官方文档:

thrift IDL

如下我定义一个RTPFile.thrift
定义一个实体,以及一个方法,方法中传入实体的list

//RTPFile IDL
namespace java service.rtp
struct RTPFile {
  1:string roomId,
  2:string fileName,
  3:string fileUrl
}

service RTPFileService{
   void convertRTPFileToMP4(1:list<RTPFile> fileList)
}

执行命令进行生成对应的文件

thrift --gen java RTPFile.thrift

生成Java文件,这个命令格式说明:

thrift --gen <language> <Thrift filename>

如果生成c++可以这样:

thrift --gen cpp RTPFile.thrift

生成文件如下:

Paste_Image.png

RTPFile.java

RTPFileService.java
以上两个文件非常长,我就不列出来了。
下面进行测试调用:
我的测试项目的目录如下:

Paste_Image.png

当然可以直接用maven插件生成,我是通过命令生成copy到IntellJ中的,效果一样:

然后定义RTPFileService的实现:

package service.rtp;

import org.apache.thrift.TException;

import java.util.List;

/**
 * Description
 * Created by qiupeng.wang on 17/4/21.
 */
public class RTPFileServiceImpl implements RTPFileService.Iface {
    @Override
    public void convertRTPFileToMP4(List<RTPFile> fileLit) throws TException {
        for (RTPFile rtpFile:fileLit){
            System.out.println( "roomId: " +rtpFile.getRoomId() +",filename: " + rtpFile.fileName + ", fileUrl: " + rtpFile.getFileUrl());
            //这里进行一些逻辑处理,比如获取信息进行下载,然后convert等等

        }
    }
}

服务器端编写:指定服务的调用:

package service.rtp;

import org.apache.thrift.TProcessor;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;


/**
 * Description
 * Created by qiupeng.wang on 17/4/21.
 */
public class RTPFileServiceServer {
    public static void main(String[] args) {
        try {
            // 设置服务端口为 9999
            TServerSocket serverTransport = new TServerSocket(9999);
            // 关联与 RTPFielService 服务的实现
            TProcessor processor = new RTPFileService.Processor(new RTPFileServiceImpl());
            TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));

            System.out.println("Start server on port 9999...");
            server.serve();
            //启动服务,等待处理内容
        } catch (TTransportException e) {
            e.printStackTrace();
        }
    }
}


编写客户端代码,模拟调用到服务端:

package service.rtp;

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;

import java.util.ArrayList;
import java.util.List;

/**
 * Description
 * Created by qiupeng.wang on 17/4/21.
 */
public class RTPFileServiceClient {

    public static void main(String[] args) {
        try {
            // 设置调用的服务地址为本地,端口为 9999
            TTransport transport = new TSocket("localhost", 9999);
            transport.open();
            // 设置传输协议为 TBinaryProtocol
            TProtocol protocol = new TBinaryProtocol(transport);
            RTPFileService.Client client = new RTPFileService.Client(protocol);
            // 调用服务的 RTPFileService 方法

            List<RTPFile> rtpFiles =  new ArrayList<RTPFile>();
            RTPFile  rtpFile = new RTPFile();
            rtpFile.setRoomId("1001");
            rtpFile.setFileName("rtp001");
            rtpFile.setFileUrl("http://xxxxx/rtp001");

            RTPFile  rtpFile2 = new RTPFile();
            rtpFile2.setRoomId("1001");
            rtpFile2.setFileName("rtp002");
            rtpFile2.setFileUrl("http://xxxxx/rtp002");

            RTPFile  rtpFile3 = new RTPFile();
            rtpFile3.setRoomId("1001");
            rtpFile3.setFileName("rtp003");
            rtpFile3.setFileUrl("http://xxxxx/rtp003");

            rtpFiles.add(rtpFile);
            rtpFiles.add(rtpFile2);
            rtpFiles.add(rtpFile3);
            client.convertRTPFileToMP4(rtpFiles);
            //调用完成关闭
            transport.close();
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
    }

}

执行: 首先调起server,然后客户端去访问:执行结果如下

Paste_Image.png

参考资料
IDL说明
thrift demo
thrift入门教程
thrift在object c和Java之间调用

上一篇下一篇

猜你喜欢

热点阅读