2015-04-23 49 views
3

我有用java編寫的服務器應用程序和常規客戶端應用程序。 我的服務器上來請求和做某事。我使用Thonft和TNonBlockingServer。Thrift TNonblockingServer EOF異常

public static void nonBlockingServer(HbaseLayerService.Processor processor) { 
      try { 
       final Integer serverPort = ConfigurationManager.instance().getServerPort(); 
       TNonblockingServerTransport serverTransport = new TNonblockingServerSocket(serverPort); 
       TServer server = new TNonblockingServer(new TNonblockingServer.Args(serverTransport).processor(processor)); 

       server.serve(); 
      } catch (Exception e) { 
       Throwables.propagate(e); 
      } 
     } 

我的客戶發送〜100Mb的數據

TTransport transport = new TFramedTransport(new TSocket('localhost', 12345, 100000)) 
transport.open() 
TProtocol protocol = new TBinaryProtocol(transport); 
HbaseLayerService.Client client = new HbaseLayerService.Client(protocol); 
def putList = [] //~1500000 objects (string, string, string, int, byte[]) 
client.putEvent(new PutEventsOperation(putsToSend)); 

此操作過程中,我有一個錯誤:

Exception in thread "main" org.apache.thrift.transport.TTransportException 
    at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132) 
    at org.apache.thrift.transport.TTransport.readAll(TTransport.java:86) 
    at org.apache.thrift.transport.TFramedTransport.readFrame(TFramedTransport.java:129) 
    at org.apache.thrift.transport.TFramedTransport.read(TFramedTransport.java:101) 
    at org.apache.thrift.transport.TTransport.readAll(TTransport.java:86) 
    at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:429) 
    at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:318) 
    at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:219) 
    at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:69) 
    at communication_struct.thrift.HbaseLayerService$Client.recv_putEvent(HbaseLayerService.java:96) 

此異常的類型爲4:END_OF_FILE

隨着TSimpleServer一切正常,但我想採取幾個連接,並在一個線程隊列中進行操作。

+0

這個問題不是關於[thrift-protocol]。這是關於運輸。 – JensG

+0

「*〜1500000 objects *」 - [數據塊的大小是多少?](https://github.com/apache/thrift/blob/7a8b286b3f03046a1b89f405129dbc042ddae818/lib/java/src/org/apache/thrift/transport/ TIOStreamTransport.java) – JensG

+0

它不小於50 MB,不超過100MB –

回答

2

最後我找到了解決方案。 在這種特殊情況下,你應該新的大小TFramedTransport.Factory添加爲象下面這樣:

TServer server = new TNonblockingServer(new TNonblockingServer.Args(serverTransport) 
        .processor(processor) 
        .transportFactory(new TFramedTransport.Factory(MAX_FRAMED_TRANSPORT_SIZE)) 
        .protocolFactory(new TBinaryProtocol.Factory()) 
      ); 

相同的操作應該在客戶端完成:

TTransport transport = new TFramedTransport(new TSocket('localhost', 12345), MAX_FRAMED_TRANSPORT_SIZE) 

在我的情況MAX_FRAMED_TRANSPORT_SIZE = 256 * 1024 * 1024

+0

我看着錯誤的文件。上面的鏈接不再是主幹'lib/java',而是2011年的一個提交。當時沒有這樣的CTOR(並且在javame中,現在還沒有)。所以是的,絕對正確的答案。 – JensG

相關問題