这是我的应用程序在更改之前的代码:
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)
不保留强引用不应该是一个问题,因为它在我的更改之前工作正常,所以需要你的帮助来弄清楚错误的原因是什么?
答案 0 :(得分:0)
不保留强引用不应该是一个问题,因为它在我的更改之前工作正常,所以需要你的帮助来弄清楚错误的原因是什么?
不保留强引用是仅问题。远程对象已经DGC并在本地垃圾收集。这就是例外的含义。
差异可归因于互联网上的DGC续租失败。这就是为什么你应该保持对远程对象的强引用,或者,如果你从JVM导出注册表到注册表:在两种情况下,在静态变量中。注册表将保留与其绑定的任何对象。