有关如何在Thrift中使用TFileTransport的示例(客户端/服务器)

时间:2014-03-22 17:19:26

标签: java thrift

是否有人设法将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的一部分,那么我们不要进入检查文件变化的额外逻辑。我会在这一点上手动执行以下操作:首先运行客户端,然后运行服务器端。

1 个答案:

答案 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都只支持阅读(还)。