Thrift 简单demo之list
2017-04-21 本文已影响442人
大龄程序员在帝都
需求:
两个Java进程之间进行通讯,客户端和服务器端,客户端发送List<RTPFile>这个消息到另外一个服务器,另外一个服务器,接收到消息后进行处理
一、首先定义IDL
如何定义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.pngRTPFile.java
和
RTPFileService.java
以上两个文件非常长,我就不列出来了。
下面进行测试调用:
我的测试项目的目录如下:
当然可以直接用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