Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么会导致RMI方法调用间歇性失败?_Java_Networking_Rmi - Fatal编程技术网

Java 什么会导致RMI方法调用间歇性失败?

Java 什么会导致RMI方法调用间歇性失败?,java,networking,rmi,Java,Networking,Rmi,长话短说,我有一个RMI服务器和客户端。服务器和客户端能够相互进行RMI调用。客户机连接到服务器后,服务器可能会在客户机上连续快速地进行数百次方法调用 问题是,在大量服务器到客户端方法调用即将结束时,有些方法将失败,因为RMI声称它无法建立从服务器到客户端的连接,即使在数百次调用成功之前也是如此。我无法发布任何真正的代码,因为这个项目相当大(大约50k行),但下面是抛出的异常的完整堆栈跟踪: java.rmi.ServerException: RemoteException occurred i

长话短说,我有一个RMI服务器和客户端。服务器和客户端能够相互进行RMI调用。客户机连接到服务器后,服务器可能会在客户机上连续快速地进行数百次方法调用

问题是,在大量服务器到客户端方法调用即将结束时,有些方法将失败,因为RMI声称它无法建立从服务器到客户端的连接,即使在数百次调用成功之前也是如此。我无法发布任何真正的代码,因为这个项目相当大(大约50k行),但下面是抛出的异常的完整堆栈跟踪:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
java.net.SocketException: Connection reset
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at $Proxy0.findClassDefinition(Unknown Source)
at com.fabric.network.NetworkClassLoader.findClass(NetworkClassLoader.java:111)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.fabric.network.NetworkClassLoader.loadClass(NetworkClassLoader.java:131)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.fabric.network.MessageSocket$CustomObjectInputStream.resolveClass(MessageSocket.java:171)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at com.fabric.network.MessageSocket.receive(MessageSocket.java:118)
at com.fabric.application.driver.NodeRemoteDriver$IncomingMessageThread.run(NodeRemoteDriver.java:205)
Caused by: java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
java.net.SocketException: Connection reset
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at $Proxy2.findClassDefinition(Unknown Source)
at com.fabric.network.ClassDefinitionCache.findClassDefinition(ClassDefinitionCache.java:78)
at com.fabric.management.host.NodeManagementServices.findClassDefinition(NodeManagementServices.java:231)
at sun.reflect.GeneratedMethodAccessor16.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.DataInputStream.readByte(Unknown Source)
... 21 more
再一次,很抱歉,我不能提供太多的代码,但我不一定要求代码修复-我只是想了解为什么会发生这种情况

编辑


添加了完整的堆栈跟踪。

好的,所以在几乎把我所有的头发都拔出来之后,结果发现RMI试图打开太多的端口。我在引擎盖下使用定制的
RMISocketFactory
实现。这个自定义实现是单例的,所以我认为没有必要实现
hashCode()
equals()
。确实是一个非常痛苦的错误

事实证明,如果RMI确定它需要创建的套接字是由
RMISocketFactory
创建的,则RMI不会重用套接字,该工厂与创建它要重用的套接字的工厂不同。RMI依赖于
equals()
hashCode()
来执行此检查。一旦我在我的定制套接字工厂中正确地实现了这两种方法,这些间歇性问题就消失了

此问题的说明可在此处找到:

无论如何,感谢大家看了这篇文章,我真的很感谢你们抽出时间

其他信息


我以前没有注意到的第二个问题是,我使用的
ServerSocket
队列空间不足,无法容纳传入的连接请求,这也导致连接被丢弃。使用构造函数
newserversocket(port,newConnectionQueueSize,bindAddress)
和更大的
newConnectionQueueSize
也有助于解决这个问题。

可以帮助你:我的问题可能有点傻,但是你检查过客户端是否有异常吗?@MartinPrakash是的,是的。这是客户端的异常。请发布堆栈跟踪的其余部分。我们需要看到下一个“原因”部分。整个事情现在就在那里。谢谢你看它!