注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

逍遥子 曰:

得失失得 何必患得患失 舍得得舍 不妨不舍不得

 
 
 

日志

 
 

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

2014-12-03 09:13:25|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

问题描述:

在使用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 TBinaryProtocol.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服务器保持一直

  评论这张
 
阅读(2690)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017