(已解决)关于菜鸟使用Vert.x的一次异常记录,寻找解决方法!(这是记录寻找解决办法的文章)

    最近接手一个项目使用了Vert.x,但在上传到服务器后突然发现服务器后台有异常出现。异常如下:

Jun 28, 2018 9:46:19 AM io.vertx.core.net.impl.ConnectionBase
SEVERE: Unhandled exception
java.io.IOException: Connection reset by peer
        at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
        at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
        at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
        at sun.nio.ch.IOUtil.read(IOUtil.java:192)
        at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
        at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288)
        at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1108)
        at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:345)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:126)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:886)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)

        at java.lang.Thread.run(Thread.java:748)

    后来检查发现,只要在IE内核的浏览器下点击关闭页面后服务器都会出现这个异常。不信邪的我把代码在windows本地打开了试了试,发现也会有这个异常,不过是windows版本的,异常如下:

六月 28, 2018 5:50:39 下午 io.vertx.core.net.impl.ConnectionBase
严重: Unhandled exception
java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:192)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1108)
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:345)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:126)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:886)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)

at java.lang.Thread.run(Thread.java:748)

    由于这个异常太长,而且IE内核的浏览器关闭都会出现,所以不能不管。我就开始了漫漫的寻找解决办法的道路,开始我以为是因为我这里使用的SocketJSHandler的原因,所以就写了个测试路由,route(“/hello”),浏览器直接访问这个路由会在页面打印一句话。我使用360打开这个路由以后再点击关闭,发现还是会有这个异常出现。这就不一定是因为我使用了SocketJSHandler的原因了。我就自己从新搭建了vert.x的项目,同样的代码,发现依然会有这个错误,这就很惊悚了,突然发现自己写的代码一直不对,自己还没有发现。

    但没放弃,我就从vert.x官网生成了一个demo,发现依然会报这个错误,这我就没有头绪了。然后百度了半天,只有一个类似的搜索结果,他是没有把response().close(),但不是说些了end()就不需要写close()了么,不理解,不过这样写确实普通的路由不会抛异常了,虽然IE关闭浏览器的时候还会有一点卡顿。(菜鸟,所以只知其然,不知其所以然)

    但是还有一个问题,因为这项目用到了StaticHandler(),静态资源映射没法写response().close(),所以静态html访问后点关闭还是会报这个错,所以卡在这里,正在寻找解决办法,慢慢记录中。如果有大佬知道解决办法,告诉我也行。


补充1:发现使用mevan的项目不会报异常,但关闭浏览器有一点卡顿,gradle的项目会抛这个异常。

补充2:使用localhost访问的时候不会出现异常,使用ip访问的时候会出现异常。

之前去GitHub上找到一条一样的问题,今天看到3天前GitHub有新回复,询问是不是3.5.2版本,我一惊就跑去看了看我的vert.x的版本,果然不是3.5.2,而是3.5.1版本,更换为3.5.2版本后异常不再抛出了。但异常还是可以被异常处理回调捕捉到。





使用socket的时候也可能捕捉到这个异常,猜测可能是因为vert.x底层的socke与IE浏览器有什么不兼容的地方,在谷歌和火狐浏览器上没有异常,也捕捉不到。

总结:

触发异常出现的情况:在IE浏览器下访问我们的路由,并且点击关闭页面,此时后台会抛出一个异常,异常描述看上边

    注:使用localhost访问时不会,使用IP访问时会抛出。

解决:换成3.5.2版本就好了,之前使用3.5.1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值