美文网首页
Thrift 简单demo之list

Thrift 简单demo之list

作者: 大龄程序员在帝都 | 来源:发表于2017-04-21 16:58 被阅读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之间调用

    相关文章

      网友评论

          本文标题:Thrift 简单demo之list

          本文链接:https://www.haomeiwen.com/subject/xsbdzttx.html