问题描述
同一RMI服务端export多个远程服务实现时,在客户端调用时有的能访问,有的不能访问,出现异常:NoSuchObjectException: no such object in table
问题分析
在远程服务器export服务实现时是通过匿名对象的方式:
SmsSenderImplsmsSender = new SmsSenderImpl();
iSmsSender =(ISmsSender) UnicastRemoteObject.exportObject(smsSender, 0);
registry.bind("SmsSender",iSmsSender);
在匿名对象创建后,没有其他的引用,方法返回后,可能会被System GC(垃圾回收),所以出现可能该对象不存在的现象。
解决方法
将服务实现对象设为static静态变量,我的相关代码如下:public static SmsSenderImpl smsSender = new SmsSenderImpl();//用static,避免NoSuchObjectException
public static ISmsSender iSmsSender = null;
public static void startSmsServer() {
try {
iSmsSender = (ISmsSender) UnicastRemoteObject.exportObject(smsSender, 0);
Registry registry = null;
int port = 9999;
try{
registry = LocateRegistry.getRegistry(port);
registry.list();
}catch(Exception ex){
registry = LocateRegistry.createRegistry(port);
}
registry.bind("SmsSender", iSmsSender);
logger.info("启动远程短信调用接口...");
} catch (Exception e) {
logger.error("启动远程短信调用接口异常!", e);
}
}