Java 尝试使用thrift';s TFileTransport和TFileProcessor

Java 尝试使用thrift';s TFileTransport和TFileProcessor,java,python,thrift,thrift-protocol,Java,Python,Thrift,Thrift Protocol,我正在尝试使用thrift的TFileTransport包装一个Java类,以便从Python调用它。我尝试使用两个协议TJSON和TBinary,但我一直遇到这个异常 org.apache.thrift.transport.TTransportException: FileTransport error: bad event size at org.apache.thrift.transport.TFileTransport.readEvent(TFileTransport.java:

我正在尝试使用thrift的TFileTransport包装一个Java类,以便从Python调用它。我尝试使用两个协议TJSON和TBinary,但我一直遇到这个异常

org.apache.thrift.transport.TTransportException: FileTransport error: bad event size
    at org.apache.thrift.transport.TFileTransport.readEvent(TFileTransport.java:327)
    at org.apache.thrift.transport.TFileTransport.read(TFileTransport.java:468)
    at org.apache.thrift.transport.TFileTransport.readAll(TFileTransport.java:439)
    at org.apache.thrift.protocol.TJSONProtocol$LookaheadReader.read(TJSONProtocol.java:263)
    at org.apache.thrift.protocol.TJSONProtocol.readJSONSyntaxChar(TJSONProtocol.java:320)
    at org.apache.thrift.protocol.TJSONProtocol.readJSONArrayStart(TJSONProtocol.java:784)
    at org.apache.thrift.protocol.TJSONProtocol.readMessageBegin(TJSONProtocol.java:795)
    at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:27)
    at org.apache.thrift.transport.TFileProcessor.processUntil(TFileProcessor.java:69)
    at org.apache.thrift.transport.TFileProcessor.processChunk(TFileProcessor.java:102)
    at org.apache.thrift.transport.TFileProcessor.processChunk(TFileProcessor.java:111)
    at org.apache.thrift.transport.TFileProcessor.processChunk(TFileProcessor.java:118)
    at com.netflix.suro.client.SendToPyServer.startThriftServer(SendToPyServer.java:51)
    at com.netflix.suro.client.SendToPyServer.main(SendToPyServer.java:67)
这就是我的Python客户端的外观:

 def __init__(self):
        self.outFile=open("../../ThriftFile.in","a")
        self.transport = TTransport.TFileObjectTransport(self.outFile)
        self.protocol = TJSONProtocol.TJSONProtocol(self.transport)
        self.client = sendPyInterface.Client(self.protocol)
        self.transport.open()

    def send(self,routingKey, message):
        self.transport.write(pickle.dumps(self.client.send_send(routingKey, message))) 


    def configClient(self,configurationDict):       
        self.transport.write(pickle.dumps(self.client.send_ClientConfig(configurationDict)))    

if __name__ == "__main__":
    SuroClient=SuroPyClient()
    configurationDict={"ClientConfig.LB_TYPE":"static","ClientConfig.LB_SERVER":"localhost:7101"}
    SuroClient.configClient(configurationDict)
    SuroClient.send("routingKey", "testMessage")
这是我的服务器:

public static void startThriftServer(SendPyInterface.Processor processor) {
            try {
                File input = new File("src/main/java/com/netflix/suro/client/ThriftFile.in");
                if(!input.exists()){
                    input.createNewFile();
                }

                File output = new File("src/main/java/com/netflix/suro/client/ThriftFile.out");
                if(!output.exists()){
                    output.createNewFile();
                }

                TFileTransport inputFileTransport = new TFileTransport(input.getAbsolutePath(), true);
                TFileTransport outputFileTransport = new TFileTransport(output.getAbsolutePath(), false);
                System.out.println(input.getAbsolutePath());
                System.out.println(input.length());

                inputFileTransport.open();
                outputFileTransport.open();
                System.out.println(inputFileTransport.getBytesRemainingInBuffer());
                inputFileTransport.setTailPolicy(tailPolicy.WAIT_FOREVER);
                System.out.println("Wait ...");
                System.out.println(inputFileTransport.getBuffer());
                TFileProcessor fProcessor = 
                        new TFileProcessor(processor, new TJSONProtocol.Factory(), inputFileTransport, outputFileTransport);
                try {
                    fProcessor.processChunk();
                } catch (TTransportException e) {
                    e.printStackTrace();
                }


                System.out.println("File Thrift service started ...");
            } catch (Exception e) {
                e.printStackTrace();
            }
我遵循了此线程中的示例:

从这个帖子: 根据/java,C++和TfLeFieldApple实际上是一个AB,它在数据之前写入一个额外的4字节头。这里的名字似乎有点误导

相反,使用的Python TFileObjectTransport只是一个简单的包装器。这意味着传输不兼容,因此会出现错误消息


因此,与其使用
TFileTransport
,不如将
tsimplefilettransport
与Java一起使用。

该博客所属,目前在曼宁作为MEAP提供。换句话说,它不仅仅是代码。当您使用JSON并查看文件时,它看起来合理吗?是的,是的,我知道会有一本书,但它还没有,几乎没有关于TFileTransport的文档,代码中也没有注释,但这个示例相当容易获得。第二个是的,JSON看起来非常合理“[1,“ClientConfig”,1,0,{“1”:{“map”:[“str”,“str”,2,{“ClientConfig.LB_类型”:“static”,“ClientConfig.LB_服务器”:“localhost:7101”}]}]N.[1,“send”,1,0,{“1”:{“str str”:“routingKey”},“2”:{“str”:“testMessage”}]N.。”这本书可以在曼宁作为MEAP获得,直到第11章。只需按照链接进行操作。
TFileTransport.readEvent()
中的
esize
ebytes
部分在我看来很奇怪。您是否可以验证您是否可以使用python读回JSON?如果是的话,请提交一张JIRA票。由于我没有足够的声誉,所以不能投票支持你的答案,但我想说声谢谢!