Exception while invoking! org.apache.thrift.protocol.TProtocolException: Bad version in readMessageB

来源:互联网 发布:阿里云1m带宽慢不慢 编辑:程序博客网 时间:2024/06/11 01:09

问题描述:

在使用thrift做开发的时候出现下面的问题:

[dp]2014-12-0217:55:23.520 WARN  [Thread-4][AbstractNonblockingServer.java:520] - Exception while invoking!

org.apache.thrift.protocol.TProtocolException:Bad version in readMessageBegin

              atorg.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:195)~[libthrift-0.9.1.jar:0.9.1]

              atorg.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:27)~[libthrift-0.9.1.jar:0.9.1]

              at org.apache.thrift.server.AbstractNonblockingServer$FrameBuffer.invoke(AbstractNonblockingServer.java:516)~[libthrift-0.9.1.jar:0.9.1]

              atorg.apache.thrift.server.TNonblockingServer.requestInvoke(TNonblockingServer.java:115)[libthrift-0.9.1.jar:0.9.1]

              at org.apache.thrift.server.AbstractNonblockingServer$AbstractSelectThread.handleRead(AbstractNonblockingServer.java:210)[libthrift-0.9.1.jar:0.9.1]

              atorg.apache.thrift.server.TNonblockingServer$SelectAcceptThread.select(TNonblockingServer.java:202)[libthrift-0.9.1.jar:0.9.1]

              atorg.apache.thrift.server.TNonblockingServer$SelectAcceptThread.run(TNonblockingServer.java:158)[libthrift-0.9.1.jar:0.9.1]

该问题出现的原因是客户端与服务器端使用的协议格式不一样导致;

服务器端代码为:


TProcessor tProcessor = new TestThriftService.Processor<TestThriftService.Iface>(m_TestThriftService);TNonblockingServerSocket tnbSocketTransport = new TNonblockingServerSocket(m_thriftPort);TNonblockingServer.Args tnbArgs = new TNonblockingServer.Args(tnbSocketTransport);tnbArgs.processor(tProcessor);tnbArgs.transportFactory(new TFramedTransport.Factory());tnbArgs.protocolFactory(new <span style="color:#cc0000;">TBinaryProtocol</span>.Factory());// 使用非阻塞式IO,服务端和客户端需要指定TFramedTransport数据传输的方式m_server = new TNonblockingServer(tnbArgs);


客户端代码为:

TestThriftService.Client getServiceClient(){TProtocol protocol = null;m_transport = new TFramedTransport(new TSocket(THRIFT_HOST,THRIFT_PORT, 2000));// 协议要和服务端一致protocol = new TCompactProtocol(m_transport);return new TestThriftService.Client(protocol);}



这个问题是开发过程中可以避免的错误,在thrift工作于nonblock模式时,必须使用TFramedTransport,另外一点是无论采用哪种模式,在协议格式上,Thrift客户端必须与Thrift服务器保持一直

0 0