是否有人设法将TFileTransport作为传输层运行?我已经尝试过了,但由于没有文档(或者我没有找到它?),我无法使其正常工作。
如果有人更成功并且可以提供一些示例代码,那就太棒了。
修改
到目前为止我尝试过:
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()));
}
}
现在我不知道我是否处于好的状态,也许我误解了这种传输的概念(同样,它没有记录)。我希望我现在通过某种方法启动服务器,它将监听输入文件。当客户端放置一些东西时,它会处理它并将输出文件的答案写入(我没有尝试编写客户端,因为代码的执行只是执行并且存在,显然不对)。
编辑2:
好的,所以如果我理解正确,这段代码是可以的,它应该处理客户端的一个请求,如果它在那里。所以我转向客户端,做这样的事情:
File input = new File(THRIFT_INPUT_FILE_PATH);
if (!input.exists()) {
input.createNewFile();
}
TTransport transport = new TFileTransport(input.getAbsolutePath(),
false);
TProtocol protocol = new TJSONProtocol(transport);
ThriftDataBenchmark.Client client = new ThriftDataBenchmark.Client(
protocol);
// my testing service, the parameters are not important
SimpleCompany company = client.getSimpleCompanyData("token", 42);
不幸地致电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的一部分,那么我们不要进入检查文件变化的额外逻辑。我会在这一点上手动执行以下操作:首先运行客户端,然后运行服务器端。
答案 0 :(得分:2)
我希望我现在通过某种方法启动服务器,它会监听输入文件。当客户端放置一些东西时,它会处理它并将输出文件的答案写入(我没有尝试编写客户端,因为代码的执行只是执行并且存在,显然不对)。
这是完全正确的。特别是,您使用的fProcessor.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都只支持阅读(还)。