Hessian是一种轻量级的remoting on HTTP工具,它使用简单的方法提供了远程方法调用(RMI)的功能,相比WebService,Hessian更简单、快捷,采用的是二进制RPC协议,非常适合于发送二进制数据,在实际使用过程中,由于各种原因,可能会遇到一些报错问题,以下是对hessain报错的详细分析:
一、Nginx反向代理时的411错误
1. 报错信息
com.caucho.hessian.client.HessianConnectionException: 411:java.io.IOException: Server returned HTTP response code: 411 for URL:http://xxxx/xxx/xxxService
2. 排查过程
一开始发现报错时,以为是服务器端返回的错误,后来了解到服务器端添加了nginx代理,不再支持绑定IP直连接口的方式,通过查资料发现Hessian在Nginx反向代理的情况下存在问题。
3. 问题原因
HTTP 411错误的解释是“Length Required”,即服务器不能处理请求,除非客户发送一个ContentLength头,这是因为Hessian与服务端通信默认是采取分块的方式(chunked encoding)发送数据,而反向代理要获得ContentLength这个头,才能处理请求,但是Hessian的请求中并没有加入这个参数。
4. 解决办法
最直接想到的办法就是传递ContentLength参数给服务器端,从而避免这个报错,具体办法是将将要发送的数据缓存下来,计算出contentlength随着请求发送给服务器端,以满足Nginx需要这个参数的需求,然而这样计算比较麻烦,所以可以使用Hessian提供的一个参数进行设置,setChunkedPost(false),这个是用来设置Hessian是否以分块发送的方式与服务端交换数据的参数,默认为true,设置为false时,向服务器端发送数据时就不采用分块方式,从而避免了报错。
二、Hessian调用重载方法报错问题(expected end of call)
1. 报错信息
org.springframework.web.util.NestedServletException: Hessian skeleton invocation failed; nested exception is com.caucho.hessian.io.HessianProtocolException: ....... Caused by: com.caucho.hessian.io.HessianProtocolException: getList: expected end of call ('xxx') at 0x53 (S). ..... com.caucho.hessian.client.HessianRuntimeException: com.caucho.hessian.io.HessianProtocolException: .......
2. 排查过程
根据报错信息可以看出是调用getList方法时报错,将服务器端提供的接口反编译发现,getList存在多个,也就是存在重载的情况。
3. 问题原因
查找相关资料发现,Hessian的HessianFactory的isOverloadEnabled属性默认为false,这个参数如果为false,Hessian调用的时候获取接口仅根据方法名;反之,Hessian调用时决定调用哪个方法是通过方法名和参数类型一起决定,所以也就解释了,存在重载的方法时为什么会报以上错误。
4. 解决办法
在初始化HessianFactory对象时写在构造函数里,对factory设置setOverloadEnabled(true),问题解决。
三、Hessian由于版本不兼容导致的报错(com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d)
1. 报错信息
com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d
2. 排查过程
这种报错通常是由于Hessian客户端和服务端的版本不一致导致的,Hessian3使用的是Hessian的通信协议,而Hessian4使用的是另一种通信协议。
3. 问题原因
当服务端和客户端的Hessian版本不统一时,就会发生此类错误,服务端是Hessian3而客户端是Hessian4,或者反之。
4. 解决办法
统一换成相同版本的Hessian库即可解决问题,如果无法统一版本,可以尝试更新客户端或服务端的接口class。
四、Hessian实现安全机制报错
1. 报错信息
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache...
2. 排查过程
项目中Hessian的异常及解决通常涉及到日志系统的初始化问题。
3. 问题原因
可能是由于log4j系统没有正确初始化导致的警告信息。
4. 解决办法
请按照提示初始化log4j系统。
五、Spring集成Hessian的问题
1. 报错信息
org.springframework.remoting.RemoteAccessException: Cannot access Hessian service at [http://61.152.162.173/remote/remoteService];
2. 排查过程
出现这个异常一般是因为服务端操作出现异常引起的。
3. 问题原因
服务端可能没有正确配置或者出现了其他异常情况。
4. 解决办法
检查服务端的配置并确保服务正常运行。
Hessian在使用过程中可能会遇到多种报错问题,但大多数问题都可以通过合理的排查和解决方案来解决,在使用Hessian时,建议尽量保持客户端和服务端的Hessian版本一致,以避免因版本不兼容而导致的问题,对于常见的错误类型,可以提前做好准备和预防措施。