繁体   English   中英

在类UnicastRemoteObject的方法'exportObject'中使用固定端口号时,出现NoSuchObjectException

[英]NoSuchObjectException when using fixed port number in method 'exportObject' of class UnicastRemoteObject

这是我的应用程序在更改之前所拥有的代码:

Static Map <String,MKRSingleton> servStubs = Collections.synchronizedMap(new HashMap<String,MKRSingleton>);
public synchronized Object test(String type) throws Exception
{

MKRSingleton = (MKRSingleton) UnicastRemoteObject.exportObject(MKRSingletonRemote,0);
servStubs.put(type,MKRSingleton);

}

在云实例上移动此代码时,我们遇到了问题。 问题似乎在于,由于传递的端口号为零,因此RMI运行时选择了远程对象在其上接收呼叫的匿名端口,但是,它与云不兼容(仅传入请求的静态端口号)因此不起作用。 我更改了代码以传递静态端口:

public synchronized Object test(String type) throws Exception
{

MKRSingleton = (MKRSingleton) UnicastRemoteObject.exportObject(MKRSingletonRemote,portNo); // portNo um getting from a property file with value like 40000
servStubs.put(type,MKRSingleton);

}

现在,它可以在云实例上运行,但是仅在特定的unix盒(非云)上会出现以下错误(它正在某些unix盒上运行):

java.rmi.NoSuchObjectException: no such object in table
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)

在我进行更改之前,如果没有很好的参考,这应该不是问题,因为它可以正常工作,因此需要您的帮助来找出错误的原因是什么?

在我进行更改之前,如果没有很好的参考,这应该不是问题,因为它可以正常工作,因此需要您的帮助来找出错误的原因是什么?

在这里, 唯一的问题就是不做充分的参考。 远程对象已经过DGC处理,并在本地进行了垃圾回收。 这就是例外的含义。

差异归因于DGC通过Internet续订租约失败。 这就是为什么您应该强烈引用远程对象的原因,或者,如果您从JVM导出注册表,则应该保留对注册表的引用:在两种情况下,都使用静态变量。 注册表将使绑定到它的所有对象保持活动状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM