gpt4 book ai didi

java.rmi.NoSuchObjectException 但添加了静态引用

转载 作者:行者123 更新时间:2023-12-01 12:28:03 24 4
gpt4 key购买 nike

我正在使用java RMI实现客户端/服务器应用程序,客户端和服务器位于同一项目中的不同包中(当然它们在同一台机器上运行),并且接口(interface)在“通用”包中定义。当我尝试获取两个远程对象之一,但出现上述异常。我读过一些 SO 答案,人们建议添加对远程对象的静态引用,以便永远不会收集它们,但这不起作用!

这是客户端和服务器的代码

通知服务代理

public class NotificheServiceProxy implements INotificheService
{

@Override
public ArrayList <NotificaDTO> generaNotifiche(String autostrada, Date data, Date oraInizio, Date oraFine)
{
try
{
RMIClient client = new RMIClient ("localhost" , 1099);
INotificheService service = (INotificheService) client.getService(INotificheService.class);
return service.generaNotifiche(autostrada, data, oraInizio, oraFine);
}
catch (RemoteException ex)
{
Logger.getLogger(TrattaServiceProxy.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
catch (NotBoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}

RMI客户端

    public class RMIClient
{
private Registry reg;

public RMIClient (String url , int port) throws RemoteException
{
reg = LocateRegistry.getRegistry(url, port);
}


public Remote getService(Class service) throws NotBoundException, RemoteException
{
RMIMapping RMIMappingAnn = (RMIMapping) service.getAnnotation(RMIMapping.class);

return reg.lookup(RMIMappingAnn.name());
}

}

NotificheService(服务器端)

public class NotificheService implements INotificheService 
{
private static NotificheService instance;


@Override
public ArrayList<NotificaDTO> generaNotifiche(String autostrada, Date data, Date oraInizio, Date oraFine) throws RemoteException
{
instance = this;
return new NotificheBusinessLogic().generaNotifiche(autostrada, data, oraInizio, oraFine);
}
}

scServerConfig(服务器主)

public class SCServerConfig
{
public static RMIServer server;
public static void main (String[] args)
{
server = new RMIServer(1099);

//avvia il server ed esporta oggetti remoti
server.start().export(TrattaService.class).export(NotificheService.class);

//Other stuff


RMIServer (starts server and provide method for remote objects exporting

public class RMIServer
{

private Registry reg;
private int regPort;



public RMIServer (int regPort)
{
this.regPort = regPort;
}

public RMIServer start()
{
try
{
reg = LocateRegistry.createRegistry(regPort);
System.out.println("SERVER OK");

}
catch (RemoteException ex)
{
Logger.getLogger(RMIServer.class.getName()).log(Level.SEVERE, null, ex);
}

return this;
}

public RMIServer export (Class object)
{
try
{

RMIMapping RMIMappingAnn = (RMIMapping) object.getInterfaces()[0].getAnnotation(RMIMapping.class);
Remote tmp = UnicastRemoteObject.exportObject((Remote)object.newInstance(), 0);

reg.rebind( RMIMappingAnn.name() , tmp );

System.out.println("oggetto remoto esportato " + object);

}
catch (InstantiationException ex)
{
System.err.println("InstantiationExeception!!\ncause:\n 1. il costruttore dell' oggetto remoto non deve avere argomenti");
}
catch (IllegalAccessException ex)
{
Logger.getLogger(RMIServer.class.getName()).log(Level.SEVERE, null, ex);
}
catch (RemoteException ex)
{
Logger.getLogger(RMIServer.class.getName()).log(Level.SEVERE, null, ex);
}


return this;
}

}

每个接口(interface)都使用提供对象绑定(bind)名称的 @RMIMapping 注释进行注释。但我确信问题不是由此而来

这对我来说是一个真正的谜,这是堆栈跟踪......非常感谢您的帮助!

ott 03, 2014 5:13:17 PM it.csbeng.speedcontrolsystem.addettoApp.proxy.NotificheServiceProxy generaNotifiche
SEVERE: null
java.rmi.NoSuchObjectException: no such object in table
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:160)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at $Proxy3.generaNotifiche(Unknown Source)
at it.csbeng.speedcontrolsystem.addettoApp.proxy.NotificheServiceProxy.generaNotifiche(NotificheServiceProxy.java:25)
at it.csbeng.speedcontrolsystem.addettoApp.coordinator.AddettoAppCoordinator.generaNotifiche(AddettoAppCoordinator.java:17)
at it.csbeng.speedcontrolsystem.addettoApp.boundary.AddettoInteraction.generaNotificheEvent(AddettoInteraction.java:179)
at it.csbeng.speedcontrolsystem.addettoApp.boundary.AddettoInteraction.access$000(AddettoInteraction.java:15)
at it.csbeng.speedcontrolsystem.addettoApp.boundary.AddettoInteraction$1.mousePressed(AddettoInteraction.java:78)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:280)
at java.awt.Component.processMouseEvent(Component.java:6502)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4489)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:696)
at java.awt.EventQueue$4.run(EventQueue.java:694)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at it.csbeng.speedcontrolsystem.addettoApp.coordinator.AddettoAppCoordinator.generaNotifiche(AddettoAppCoordinator.java:20)
at it.csbeng.speedcontrolsystem.addettoApp.boundary.AddettoInteraction.generaNotificheEvent(AddettoInteraction.java:179)
at it.csbeng.speedcontrolsystem.addettoApp.boundary.AddettoInteraction.access$000(AddettoInteraction.java:15)
at it.csbeng.speedcontrolsystem.addettoApp.boundary.AddettoInteraction$1.mousePressed(AddettoInteraction.java:78)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:280)
at java.awt.Component.processMouseEvent(Component.java:6502)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4489)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:696)
at java.awt.EventQueue$4.run(EventQueue.java:694)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

编辑:@EJP 在此之前,我做过类似的事情

public class RemoteObject implements IRemoteObject
{
private static RemoteObject instance;

public RemoteObject ()
{
instance = this;
}

public someType someMethod (...)
}

但它抛出了相同的异常。此外,如您所见,在 scServerConfig 中有一个 公共(public)静态RMIServer服务器;

它封装了注册表引用。如果我所做的这些事情是正确的,我认为添加静态引用可能还不够,甚至艰难的“突然”开始对我起作用。我错了吗?

最佳答案

java.rmi.NoSuchObjectException but static reference added

未添加。您正在尝试调用添加它的远程方法。你在这方面失败了,所以它还没有发生。

您需要在远程对象的构造函数中设置静态实例。在远程方法中执行此操作可能已经太晚了。

我建议您还将注册表保留在静态变量服务器端。事实上,严格来说,这是您需要保持静态的唯一引用。

关于java.rmi.NoSuchObjectException 但添加了静态引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26182024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com