Java 关于如何在Thrift(客户端/服务器)中使用TFileTransport的示例
是否有人设法将TFileTransport作为传输层来工作?我已经试过了,但是因为没有文档(或者我没有找到它?),所以我无法让它工作 如果有人能更成功地提供一些示例代码,那就太好了 编辑: 到目前为止,我所尝试的:Java 关于如何在Thrift(客户端/服务器)中使用TFileTransport的示例,java,thrift,Java,Thrift,是否有人设法将TFileTransport作为传输层来工作?我已经试过了,但是因为没有文档(或者我没有找到它?),所以我无法让它工作 如果有人能更成功地提供一些示例代码,那就太好了 编辑: 到目前为止,我所尝试的: public class FileThriftServer { public static void startThriftServer( ThriftDataBenchmark.Processor<ThriftDataBenchmarkHandler>
public class FileThriftServer {
public static void startThriftServer(
ThriftDataBenchmark.Processor<ThriftDataBenchmarkHandler> processor) {
try {
File input = new File("ThriftFile.in");
if(!input.exists()){
input.createNewFile();
}
File output = new File("ThriftFile.out");
if(!output.exists()){
output.createNewFile();
}
TFileTransport inputFileTransport = new TFileTransport(input.getAbsolutePath(), true);
TFileTransport outputFileTransport = new TFileTransport(output.getAbsolutePath(), false);
inputFileTransport.open();
outputFileTransport.open();
TFileProcessor fProcessor =
new TFileProcessor(processor, new TJSONProtocol.Factory(), inputFileTransport, outputFileTransport);
// this results in error in case I don't call those open methods above
fProcessor.processChunk();
System.out.println("File Thrift service started ...");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// ThriftDataBenchmarkHandler is an implementation of my test service
startThriftServer(new ThriftDataBenchmark.Processor<ThriftDataBenchmarkHandler>(
new ThriftDataBenchmarkHandler()));
}
}
不幸的是,调用getSimpleCompanyData
会导致:
org.apache.thrift.transport.TTransportException: Not Supported
at org.apache.thrift.transport.TFileTransport.write(TFileTransport.java:572)
at org.apache.thrift.transport.TTransport.write(TTransport.java:105)
at org.apache.thrift.protocol.TJSONProtocol.writeJSONArrayStart(TJSONProtocol.java:476)
at org.apache.thrift.protocol.TJSONProtocol.writeMessageBegin(TJSONProtocol.java:487)
at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:62)
服务器端需要输入和输出传输,但在客户端,它只接受一个,这有点令人困惑。它是如何读取答案的?从哪里读取
如果文件还不是Thrift的一部分,那么我们就不要进入检查文件更改的额外逻辑。在这一点上,我可以手动操作:首先运行客户端,然后运行服务器端
我希望现在通过某种方法启动服务器,该方法将侦听输入文件。当客户机把一些东西放在那里时,它会处理它并将答案写入输出文件(我还没有尝试编写客户机,因为这种代码的和平只是执行和存在的,这显然是不对的)
完全正确。特别是,您使用的fpprocessor.processChunk()
调用将只处理一个块(当前块)。整个类看起来都是在假定文件大小是静态的并且不会随时间变化的情况下设计的。但是,底层的TFileTransport
支持所谓的tailPolicy
,在读取调用点击EOF
时使用:
public class TFileTransport extends TTransport {
public static enum tailPolicy {
NOWAIT(0, 0),
WAIT_FOREVER(500, -1);
/**
* Time in milliseconds to sleep before next read
* If 0, no sleep
*/
public final int timeout_;
/**
* Number of retries before giving up
* if 0, no retries
* if -1, retry forever
*/
public final int retries_;
// ... ctor ...
}
/**
* Current tailing policy
*/
tailPolicy currentPolicy_ = tailPolicy.NOWAIT;
另一个让它工作的选项是调用fProcessor.processChunk(int chunkNum)
,分别观察文件内容,并在收到新数据时重复调用。使用TFileProcessor
作为起点并根据需要对其进行改进肯定不是一个坏主意
// this results in error in case I don't call those open methods above
fProcessor.processChunk();
使用前打开传送带即可。我认为那部分没问题
org.apache.thrift.transport.TTransportException: Not Supported
at org.apache.thrift.transport.TFileTransport.write(TFileTransport.java:572)
at org.apache.thrift.transport.TTransport.write(TTransport.java:105)
不幸的是,这似乎还相当正确。唯一实现写入的地方是C++库中的代码。Java和D都只支持读取(尚未) 顺便说一句:据说TFileTransport acutally没有Java版本,但它一定很旧,因为在Thrift 0.9.1中,您可以看到类的存在。如果您能够更具体地说明(a)您尝试了什么,以及(b)“不起作用”的实际含义,这可能会有所帮助。(顺便说一句,我总是想知道为什么即使是在IT行业工作的人也不能给出一个深刻的问题描述。你怎么能期望你的用户/客户这样做?)a)我可以补充一些我已经尝试过的东西。我之所以没有这么做,是因为这只会误导别人,但好吧,我会这么做。b) 你熟悉节俭吗?因为你的问题表明你不是。它是一种创建服务的技术,通过“工作”,我的意思是有一个客户机和服务器,客户机能够调用服务器方法并获得响应。我相信这是显而易见的,从我所期望的工作服务,它不需要额外的描述。我不明白你对我的客户的期望是什么?很好,所以至少我知道服务器端应该工作。不幸的是,我仍然无法进行信息交换的往返,请检查我的编辑2。我只是添加了一些关于我以前错过的阅读端的更多信息。关于编写,代码确实是不完整的。看起来好像有人停在了他/她的特定目的所需的地方。
org.apache.thrift.transport.TTransportException: Not Supported
at org.apache.thrift.transport.TFileTransport.write(TFileTransport.java:572)
at org.apache.thrift.transport.TTransport.write(TTransport.java:105)