关于spring remoting的rmi服务2.5版本和3.0版本不兼容的解决办法
? ? ? ? ? ?这两天在研究一个其他组的人提供的服务,服务器端使用spring的remote进行rmi接口暴露的,客户端调用rmi接口。发现一直报下面的错误。
?
?
?
? ? ? 从错误信息来看,是这个类org.springframework.remoting.rmi.RmiInvocationWrapper_Stub没有,从网上也发现了,这个是由于spring2和spring3的rmi方式调用方式不同引起的,通过查阅相关文档后发现,spring3不在需要生成skeleton和stub了,所以把这个类从spring-context中删除了,解决办法就是想办法将它再加进来,知道了病根就知道了怎么治病了,下面给出药方:
?
? ?就是将RmiInvocationWrapper_Stub类从spring2里面解压出来,然后再生成一个包。
? ?这边给出来解决的办法:
? ?1. 下载spring-context的2.5.6版本的程序,将其解压,解压命令如下:
?
?
二:返回代理对象
? RmiProxyFactoryBean是FactoryBean接口的实现 其返回的是getObject方法 返回的对象
?
非标准Rmi处理 方法名 参数封装成InvocationHandler 通过中转站方法调用目标方法
?
RemoteInvocation定义?
public class RemoteInvocation implements Serializable {private String methodName;private Class[] parameterTypes;private Object[] arguments;private Map attributes;public RemoteInvocation(MethodInvocation methodInvocation) {this.methodName = methodInvocation.getMethod().getName();this.parameterTypes = methodInvocation.getMethod().getParameterTypes();this.arguments = methodInvocation.getArguments();}}?
总结一下:
标准的Rmi 即实现了jdk Remote接口的?? 直接使用反射机制调用非标准的Rmi? spring暴露服务时包装成自己的对象[RmiInvocationHandler]? 当客户段调用的时候?? 被拦截器拦截? 封装方法名 ?参数等信息 最后调用RmiInvocationHandler的invoke方法? invoke方法类似中转站(泛化调用)?? 只要非标准Rmi 方法调用都会经过它调用目标方法。Spring对RMI的支持果然很不错,在Cglib等工具的支持下,使用RMI终于可以同Naming、rmic和stub告别了。用以发布RMI的接口不能从java.rmi.Remote继承而来,否则就会出现“Stub class not found”的错误,原因有待深究。Spring的BeanFactory创建bean实例是有序的,向RMI、JNDI、WebService等注册服务性质的应用,同一应用中的客户端要根据其依赖性调整配置顺序。
?
?
1 楼 jinnianshilongnian 1 小时前 额,确实有这个问题
http://docs.spring.io/spring/docs/upgrade/spring3/html/ch04s02.html 2 楼 asialee 1 小时前 jinnianshilongnian 写道额,确实有这个问题
http://docs.spring.io/spring/docs/upgrade/spring3/html/ch04s02.html
其实我也是看到了这个文章,其他的都说不兼容,看了这个就详细了,感觉spring应该是无侵入的,怎么rmi这块有这个问题。 3 楼 jinnianshilongnian 24 分钟前 是啊,一直觉得spring兼容性非常好,哈哈。估计设计这个的人经验也不足 哈哈