Troubles in RMI

原创 2007年10月05日 00:18:00

 

 

前几天把一个RMI应用迁移到新的机器,之前这个应用运行在一台增强版的PC上。
新机器上面的环境“理论上”跟以前的环境是一样的,至少我是这样要求服务器管理员的。
用同样的shell启动应用,问题发生了,应用并没像在之前的环境那样正常的运行,查log发现报RMI Exception

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; 
nested exception is:
java.lang.ClassNotFoundException: XXX_Stub
XXX_Stub是RMI Server的Stub,其class文件跟应用的其他class文件包在同一个JAR里面,为什么新环境偏偏就找不到呢?
请教了Mr. Smith,发现许多人遇到了类似的问题,解法也是五花八门。
有人说是环境属性CLASSPATH没添加那个XXX_Stub所在的JAR的路径,造成RMI REGISTRY无法找到这个XXX_Stub。
于是在启动的shell里面添加
   
export CLASSPATH={path/to/JAR}
再次启动,不再报RMI Exception了,在新环境启动应用的Client测试RMI Server,一切正常。看来那位老兄说对了。
问题确认,再来检查新旧环境的user profile设置,果然发现新环境的user profile恰恰少了这个CLASSPATH的设定。在这里补上,就不用改启动的shell了。

不过接下来在另外一台机器上启动应用的Client测试RMI Server的时候却出现异常。
先还以为是新环境上charset的设置有问题,使RMI Server传回的xml中出现乱码,从而造成错误。
在这个方向上查了半天,还参考了车东大哥写的Java中文处理学习笔记 ,后来才发现并非charset方面的问题,因为即使RMI Server产生的是正确的xml,也不能正确的传回Client。于是回过头来查Client的log,在Debug Log中发现这么一个错误:
   
java.rmi.ConnectException: Connection refused to host: 127.0.0.1...
奇怪,Client明明设定去连Server的IP,怎么这里却变成了127.0.0.1?再次请教了史密斯先生,说是需要检查一下RMI Server所在环境的Linux /etc/hosts 中的设定。果然发现管理员兄弟“特地”把机器别名指向到了127.0.0.1,类似如下这样的格式
127.0.0.1   localhost.localdomain   localhost   hostalias
{true_ip}   hostalias

把第一行最后那个多余的hostalias拿掉,重启RMI Server,Client便可正常连接并操作了。

搞定收工!!

小结一下处理这次麻烦的体会。
  1. 基于RMI开发出来的应用在易用性上不如基于其他部分的Java平台的应用。特别是涉及到应用的跨平台迁移,比如Windows <--> Linux,则有许多牵涉到OS层面的设定问题。如针对RMI REGISTRY的CLASSPATH的设定,Linux上面etc/host 的设定。这些细节稍不留意,应用就无法正常运行,原因还不易发现。
  2. 借此机会复习了RMI 的通信模型:先是RMI Server向RMI REGISTRY注册并提交Stub,于是RMI Client就可在RMI REGISTRY中查找RMI Server的确切位置并下载Stub,最后RMI Client就依获取的Stub及RMI Server的确切位置跟RMI Server建立连接并执行操作。这次遇到的问题实际上都跟RMI REGISTRY有关。第1个问题是因为RMI REGISTRY在注册的时候没找到RMI Stub的确切位置,第2个问题则源于RMI REGISTRY在Linux上才会有的表现,当RMI Client向其查询RMI Server的确切位置的时候,它会去查 /etc/hosts 中的设定,并试图返回OS层面所设定的IP。自己对其中具体的逻辑还不了解,不过可以肯定的是,如果 /etc/hosts中设定错了,RMI Client将无法得到的正确的RMI Server的位置。
  3. 费了许多心思才把问题搞定,这次一定要让“粗心”的管理员兄弟请客!哈哈。
  4. 或许...我也要请一下这位兄弟的。

--END
 

相关文章推荐

Intellij 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099,端口被占用

代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099 端口被占用 解决方案: 1.查找出占用进程id 2.杀死进...

RMI in Spring

spring对远程过程调用(RPC)提供了强大的支持,包括远程方法调用(RMI),Hessian和Burlap和Spring自带的Http invoker。 在以上所有模型中,服务都作为spring所...

HDU 2826 || The troubles of lmy(判断两个N边形是否相似

题目给出两个N边形的逆时针的N个顶点,求问两个N边形是否相似。 用这个定理就ok啦-> #include #include #include #include #include using na...
  • FXXKI
  • FXXKI
  • 2015年04月16日 21:44
  • 530

UVa10276 HDU1329 ZOJ1239 Hanoi Tower Troubles Again!【递推函数+打表】

Hanoi Tower Troubles Again! People stopped moving discs from peg to peg after they know the numbe...

HNU Judging Troubles (字典树)

Judging Troubles Time Limit: 5000ms, Special Time Limit:12500ms, Memory Limit:65536KB Tot...

CodeForces 283C Coin Troubles 背包问题 分析问题

汉化题意你有n种不同的硬币,每个硬币有一个价值ai(不同硬币价值可能相同) 我有这些硬币总价值为t,并且给出q对(b,c),告诉你第b种硬币的数量严格大于第c中硬币的数量。保证这q对(b,c)中所...

UVa Problem 10276 Hanoi Tower Troubles Again! (汉诺塔卷土重来!)

// Hanoi Tower Troubles Again! (汉诺塔卷土重来!) // PC/UVa IDs: 110908/10276, Popularity: B, Success rate: ...

joj 1031 Hanoi Tower Troubles Again!解题报告

  1031: Hanoi Tower Troubles Again!ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE3s8192K1034606S...

HDU 1329 Hanoi Tower Troubles Again!

Description People stopped moving discs from peg to peg after they know the number of steps neede...

rmi服务端与客户端小程序

  • 2016年07月15日 16:01
  • 4.12MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Troubles in RMI
举报原因:
原因补充:

(最多只允许输入30个字)