`
sagahl
  • 浏览: 23810 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

hessian无法调用远端的重载方法

 
阅读更多

这段时间在用hessian,发现无法很好的支持方法重载。原有的程序接口如下。

/**
 * @author sagahl
 *
 */
public interface DisCountService {

	/**双方验证签名的md5key*/
	public String md5key = "xxxxxxxxxxxxx";
	/**
	 * 根据xx查询aDiscountQueryVO 查询
	 * @param DiscountQueryVO aDiscountQueryVO
	 * @param  signature  --签名  ,对aDiscountQueryVO.userId 进行md5签名
	 * @return  DiscountResultVO
	 *
	 */
	public DiscountResultVO  getDiscountBy(DiscountQueryVO aDiscountQueryVO,String signature);


}

 由于业务的需要接口的入参需要更改,但是又需要保留原有的接口方法名。于是定义接口如下:

public interface DisCountService {

	/**双方验证签名的md5key*/
	public String md5key = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
	/**
	 * @param DiscountQueryVO aDiscountQueryVO
	 * @param  signature  --签名  ,对aDiscountQueryVO.userId 进行md5签名
	 * @return  DiscountResultVO
	 *
	 */
	public DiscountResultVO  getDiscountBy(DiscountQueryVO aDiscountQueryVO,String signature);
	
	/**
	 * @param DiscountQueryVO aDiscountQueryTwoVO
	 * @param  signature  --签名  ,对aDiscountQueryVO.userId 进行md5签名
	 * @return  DiscountResultVO
	 *
	 */
	public DiscountResultVO  getDiscountBy(DiscountQueryTwoVO aDiscountQueryTwoVO,String signature);
}

 通过不同的入参调用服务端不同的方法。但是发现服务端实现了两个方法,但通过调用

public DiscountResultVO  getDiscountBy(DiscountQueryTwoVO aDiscountQueryTwoVO,String signature);

发现在服务端实际调用的还是

public DiscountResultVO  getDiscountBy(DiscountQueryVO aDiscountQueryVO,String signature);

让我很疑惑不解。看了hessian的代码后才发现原因。

hessian中HessianSkeleton中的

    String methodName = in.readMethod();
    Method method = getMethod(methodName);

 是最终取得的反射的方法,methodName的值为getDiscountBy。getMethod(methodName)的实现是

  protected Method getMethod(String mangledName)
  {
    return (Method) _methodMap.get(mangledName);
  }

 而_methodMap的值是接口DisCountService中所有的方法。这个时候后取到的是第一个方法。

以上所述表明,无法调用方法重载的远端服务,至少会有可能不准确。提出的方案是将调用的方法的参数也传到服务端,再通过方法名和参数调用准确的方法。不知道是否合理。

新手发帖请各位指正!

 

 

 

 

 

分享到:
评论
3 楼 sagahl 2011-11-11  
jameshwh 写道
Hessian是有能力支持重载方法的,只需要启动开关即可,代码如下:
String url = "http://" + host + "/tntcalws/remoting/" + serviceName;
HessianProxyFactory factory = new HessianProxyFactory();
factory.setOverloadEnabled(true);

非常感谢,确实好像3.15还是3.2.0以后就支持重载了,但是当时那个版本(好像是2.xx)是不支持的,具体我忘记了。
2 楼 jameshwh 2011-11-09  
Hessian是有能力支持重载方法的,只需要启动开关即可,代码如下:
String url = "http://" + host + "/tntcalws/remoting/" + serviceName;
HessianProxyFactory factory = new HessianProxyFactory();
factory.setOverloadEnabled(true);
1 楼 angi0003 2009-11-17  
今天遇到同样的问题了,谢谢!

相关推荐

    java+hessian 远程调用

    Hessian是BEA Systems开发的一种二进制Web服务协议,它提供了序列化和远程方法调用的机制。在Java项目中,Hessian被广泛用于服务间的通信,尤其是对于那些需要快速、低开销的通信场景。 1. **Hessian服务端**: - ...

    Hessian远程调用框架学习一

    Hessian远程调用框架是基于Java的轻量级RPC(Remote Procedure Call)解决方案,它允许开发者在分布式系统中实现高效、便捷的跨网络对象方法调用。本教程将引导你入门Hessian,通过一个简单的JAVA demo来理解其工作...

    hessian实现远程调用

    在IT行业中,远程调用是一种常见的技术,使得客户端可以跨网络调用远程服务器上的方法,就像调用本地方法一样方便。Hessian是Apache项目下的一个轻量级的RPC(Remote Procedure Call,远程过程调用)框架,它提供了...

    Hessian远程调用RPC最简单demo

    Hessian是Apache软件基金会的Caucho项目开发的一个开源RPC框架,它支持二进制协议,能够高效地进行远程方法调用。本教程将详细介绍"Hessian远程调用RPC最简单demo",包括服务器端服务发布和客户端服务调用的实现,...

    hessian-4.0.33.jar

    5. 调用服务:通过代理对象,像调用本地方法一样调用远程服务的方法。 四、Hessian的优势与应用场景 Hessian的主要优势在于其高效的数据传输和简单易用的API,这使得它在低带宽环境或者对性能要求较高的场景下尤为...

    Hessian调用

    在IT行业中,Hessian是一种基于二进制协议的远程方法调用(RMI)框架,它由Caucho Technology开发并维护。Hessian的目标是提供高效、简单的方式进行跨语言、跨平台的服务调用,尤其适合Java和Adobe Flex之间的通信。在...

    Hessian Binary Web Service Protocol远程接口调用入门Demo

    Hessian提供了一个URL,客户端通过这个URL可以直接调用服务端的方法,就像调用本地方法一样。客户端需要导入Hessian的库,然后使用HessianProxyFactory创建服务的代理对象。 4. **执行远程调用**:现在,客户端可以...

    hessian demo 包括服务端和客户端

    Hessian是一种高效的RPC(Remote Procedure Call)协议,它允许Java应用程序之间进行远程方法调用,类似于RMI(Remote Method Invocation)。Hessian由Caucho公司开发,它的主要优点在于序列化效率高,能够将Java...

    spring整合hessian进行远程通讯

    Hessian是一种二进制Web服务协议,它提供了一种轻量级、高效的远程方法调用方式。它基于HTTP协议,可以将Java对象序列化为二进制格式,减少了网络传输的数据量,从而提高了通信效率。 Spring框架提供了强大的依赖...

    hessian框架应用,实现远程调用,分布式开发

    Hessian框架是一款轻量级的Java远程方法调用(Remote Method Invocation, RMI)框架,由Caucho Technology公司开发。它主要应用于分布式系统中,允许应用程序通过HTTP协议进行高效、透明的远程调用,降低了分布式...

    hessian php与java通讯demo源码

    - Java客户端会通过Hessian库与服务器端建立连接,调用服务端暴露的方法。 - 客户端代码需要知道服务器的URL以及要调用的服务接口。Hessian库会自动处理序列化和反序列化,使得客户端可以像调用本地方法一样调用...

    hessian示例远程轻量级传输

    此外,Hessian还支持类型安全的方法调用,确保客户端和服务器端之间的接口匹配。 ### Hessian的优点 1. **效率高**:由于使用二进制格式,Hessian在传输数据时占用的带宽更少,解析速度更快。 2. **简单易用**:...

    Hessian

    Hessian是一种二进制Web服务协议,它由Caucho Technology公司开发,主要用于提供轻量级、高效的远程方法调用(Remote Method Invocation,RMI)服务。Hessian的目标是简化分布式系统之间的通信,通过减少网络传输的...

    Hessian与spring整合

    在IT行业中,Hessian是一种轻量级的远程过程调用(RPC)协议,它使得服务端的方法可以直接在客户端被调用,仿佛它们就在本地一样。Hessian基于HTTP协议,使用二进制编码,以提高传输效率和性能。而Spring框架是Java...

    Hessian协议格式

    在示例代码中,我们将通过 Hessian protocol 调用这四个方法,并截取并分析请求报文和应答报文的格式。 2.1 Hessian 报文结构应用示例背景说明 在示例代码中,我们使用 Java 语言编写了一个简单的示例,用于形象地...

    轻量级远程服务调用Hessian的入门实例和与Spring整合的实例.zip

    在服务器端,通过HessianServlet来暴露这个服务,客户端则通过HessianProxyFactory来创建服务代理,从而能够调用远程服务的方法。这种简单设置可以让开发者快速理解Hessian的基本工作原理。 二、Hessian与Spring...

    Hessian学习简单demo

    Hessian的目标是提供一种快速、简洁的数据序列化和远程方法调用(RPC)机制。在这个简单的demo中,我们将探讨Hessian的核心概念,以及如何在实际应用中使用它。 首先,我们需要理解什么是数据序列化。数据序列化是...

    android端使用hessian跟web服务器通讯

    1. 调用远程方法:在Android客户端,你可以像调用本地方法一样调用远程服务的方法,Hessian库会自动处理网络通信和序列化细节。 ```java String result = service.remoteMethod("参数"); ``` 2. 处理结果:服务器...

    hession远程调用分享

    《Hessian远程调用技术详解》 在分布式系统中,远程调用是常见的通信方式,它使得服务可以跨越网络边界,实现组件之间的交互。Hessian,由Caucho公司开发,是一种高效的二进制RPC(Remote Procedure Call)协议,常...

Global site tag (gtag.js) - Google Analytics