简体   繁体   English

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

[英]java.rmi.NoSuchObjectException but static reference added

i'm implementing a client/server app with java RMI, client and server are in different packages in the same project (and of course they run on the same machine) and interfaces are defined in a "common" package.When i try to get one of the two remote object i get the aforementioned excepition. 我正在使用Java RMI实现客户端/服务器应用程序,客户端和服务器位于同一项目中的不同程序包中(当然,它们在同一台计算机上运行),并且接口在“通用”程序包中定义。得到两个远程对象之一,我得到了上述例外。 I've read some SO answers where people sugget to add a static reference to remote object so they can be never collected, but this doesn't work! 我读过一些SO答案,人们建议将静态引用添加到远程对象,这样就永远无法收集它们,但这是行不通的!

here is the code of the client and server 这是客户端和服务器的代码

NotificheServiceProxy NotificheServiceProxy

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;
    }
}

RMIClient RMIClient

    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 (server side) 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 (server main) 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;
    }

 }

Each interface is annotated with @RMIMapping annotation that provides the object binding name. 每个接口都有@RMIMapping注释,该注释提供了对象绑定名称。 But i'm sure that the problem doesn'come from this 但我确定问题不会因此而来

This is for me a real mistery, this is the stacktrace......many thanks for help! 对我来说,这真是个难题,这是stacktrace……非常感谢您的帮助!

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)

EDIT: @EJP before that, i've done something like 编辑:@EJP在此之前,我已经做了类似

public class RemoteObject implements IRemoteObject
{
    private static RemoteObject instance;

    public RemoteObject ()
    {
       instance = this;
    }

    public someType someMethod (...)
}

but it throwed the same exception. 但是它抛出了同样的异常。 Furthermore, as you can see, in scServerConfig there is a public static RMIServer server; 此外,如您所见,在scServerConfig中有一个公共的静态RMIServer服务器。

which encapsulates a Registry reference. 它封装了注册表参考。 if these thing i've done are correct, i think that adding static references may not be enough, even tough "suddendly" started to work for me. 如果我所做的这些事情是正确的,我认为添加静态引用可能还不够,即使艰难的“突然”也开始为我工作。 Am I wrong? 我错了吗?

java.rmi.NoSuchObjectException but static reference added java.rmi.NoSuchObjectException但添加了静态引用

It isn't added. 没有添加。 You're trying to call the remote method that adds it. 您正在尝试调用添加它的远程方法。 You're failing at that, so it hasn't hapoened yet. 您在那方面失败了,所以它还没有得到加强。

You need to set the static instance in the constructor of your remote object. 您需要在远程对象的构造函数中设置静态实例。 Doing it in the remote method may already be too late. 用远程方法执行此操作可能已经为时已晚。

I suggest you also keep the Registry in a static variable server side. 我建议您也将注册表保留在静态变量服务器端。 In fact strictly speaking that's the only reference you need to keep static. 实际上严格来说,这是您需要保持静态的唯一参考。

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

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