nioprocess高并发时候,有时候强制关闭了客户端会出现这个异常,具体正在研究,立贴为证
错误如下:
exceptionCaught 客户端发生异常
java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)
at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:592) ~[na:0.0]
at libcore.io.IoBridge.recvfrom(IoBridge.java:568) ~[na:0.0]
at java.nio.SocketChannelImpl.readImpl(SocketChannelImpl.java:342) ~[na:0.0]
at java.nio.SocketChannelImpl.read(SocketChannelImpl.java:304) ~[na:0.0]
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:317) ~[na:0.0]
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:45) ~[na:0.0]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:683) ~[na:0.0]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:659) ~[na:0.0]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:648) ~[na:0.0]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:68) ~[na:0.0]
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1120) ~[na:0.0]
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) ~[na:0.0]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) ~[na:0.0]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) ~[na:0.0]
at java.lang.Thread.run(Thread.java:818) ~[na:0.0]
Caused by: android.system.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)
at libcore.io.Posix.recvfromBytes(Native Method) ~[na:0.0]
at libcore.io.Posix.recvfrom(Posix.java:177) ~[na:0.0]
at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:245) ~[na:0.0]
at libcore.io.IoBridge.recvfrom(IoBridge.java:565) ~[na:0.0]
... 13 common frames omitted
java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)
at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:592) ~[na:0.0]
at libcore.io.IoBridge.recvfrom(IoBridge.java:568) ~[na:0.0]
at java.nio.SocketChannelImpl.readImpl(SocketChannelImpl.java:342) ~[na:0.0]
at java.nio.SocketChannelImpl.read(SocketChannelImpl.java:304) ~[na:0.0]
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:317) ~[na:0.0]
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:45) ~[na:0.0]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:683) ~[na:0.0]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:659) ~[na:0.0]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:648) ~[na:0.0]
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:68) ~[na:0.0]
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1120) ~[na:0.0]
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) ~[na:0.0]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) ~[na:0.0]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) ~[na:0.0]
at java.lang.Thread.run(Thread.java:818) ~[na:0.0]
Caused by: android.system.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)
at libcore.io.Posix.recvfromBytes(Native Method) ~[na:0.0]
at libcore.io.Posix.recvfrom(Posix.java:177) ~[na:0.0]
at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:245) ~[na:0.0]
at libcore.io.IoBridge.recvfrom(IoBridge.java:565) ~[na:0.0]
... 13 common frames omitted
如题分析:
由于mina2 网络请求底层是采用多线程执行网络任务,比如网络发送依次启动了 nioprocess1、nioprocess2、 nioprocess3 、nioprocess4、。。。。然后如果运行到nioprocess10的时候,在关闭nioprocess5的时候,由于jvm关掉了nioprocess5,而nioprocess5实际任务未结束,然后就会报出此Connection reset by peer异常。
那问题就很显而易见了,多线程的控制是导致该问题的本质原因。具体多线程的控制,请参照sdk。