HCRM博客

Hessain报错,如何解决这一常见问题?

Hessian是一种轻量级的remoting on HTTP工具,它使用简单的方法提供了远程方法调用(RMI)的功能,相比WebService,Hessian更简单、快捷,采用的是二进制RPC协议,非常适合于发送二进制数据,在实际使用过程中,由于各种原因,可能会遇到一些报错问题,以下是对hessain报错的详细分析:

一、Nginx反向代理时的411错误

1. 报错信息

Hessain报错,如何解决这一常见问题?-图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时,向服务器端发送数据时就不采用分块方式,从而避免了报错。

Hessain报错,如何解决这一常见问题?-图2
(图片来源网络,侵权删除)

二、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调用时决定调用哪个方法是通过方法名和参数类型一起决定,所以也就解释了,存在重载的方法时为什么会报以上错误。

Hessain报错,如何解决这一常见问题?-图3
(图片来源网络,侵权删除)

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版本一致,以避免因版本不兼容而导致的问题,对于常见的错误类型,可以提前做好准备和预防措施。

本站部分图片及内容来源网络,版权归原作者所有,转载目的为传递知识,不代表本站立场。若侵权或违规联系Email:zjx77377423@163.com 核实后第一时间删除。 转载请注明出处:https://blog.huochengrm.cn/gz/12135.html

分享:
扫描分享到社交APP
上一篇
下一篇