- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用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/
当我启动 spark 时,我收到以下警告: Using Scala version 2.10.5 (OpenJDK 64-Bit Server VM, Java 1.8.0_77) Type in e
我尝试设置一个简单的 RMI 实现,但遇到了一些麻烦。 服务器启动正常,但客户端似乎永远找不到远程对象(Naming.lookup 每次都失败)。通过阅读周围的内容,人们提到将远程对象(Bank)存储
我有一个使用 Java RMI 的服务器和客户端。如果我使用一个客户端,下面的代码一切都很好。但是,如果我连接一个客户端,然后连接第二个客户端,它会抛出端口已在使用异常。没关系,所以我断开连接的客户端
我正在使用java RMI实现客户端/服务器应用程序,客户端和服务器位于同一项目中的不同包中(当然它们在同一台机器上运行),并且接口(interface)在“通用”包中定义。当我尝试获取两个远程对象之
已经有几个与此相关的问题,但他们的答案表明导出的对象已在服务器端进行 GC,这解决了问题。然而,这似乎不是这里的问题。 提到的异常仅在单台机器上抛出: PRETTY_NAME="Debian GNU/
我在 Weblogic 11g 上运行 Java 6。 我正在开发一个使用 EJB 与数据库通信的 Web 服务项目。目前我正在处理错误,因此我尝试在调用 Web 服务之前取消部署 EJB。我的 EJ
我正在开发两个通过 RMI 连接的应用程序。通信是双向的,一切正常,直到我在 Windows 上运行。当我将 jar 文件传输到 Debian 时,连接失败并显示 java.rmi.NoSuchObj
我正在编写一个非常简单的 RMI 服务器,我在单元测试中看到间歇性的 java.rmi.NoSuchObjectExceptions。 我在同一个对象上有一串远程方法调用,虽然前几个通过,但后面的有时
我有一个简单的程序,可以使 calcPi() 通过 Java-RMI 可用,当我启动程序时,我收到此异常: java.rmi.NoSuchObjectException: no such object
这是我的应用程序在更改之前的代码: Static Map servStubs = Collections.synchronizedMap(new HashMap); public synchroni
我是一名优秀的程序员,十分优秀!