在保持活动超时时为 Vert.x 邮件发送器重置连接
Posted
技术标签:
【中文标题】在保持活动超时时为 Vert.x 邮件发送器重置连接【英文标题】:Connection Reset for Vert.x mailsender on keep alive timeout 【发布时间】:2022-01-03 14:55:10 【问题描述】:我们有一个基于 Quarkus (2.4.2) 的应用程序,它的邮件发送者是 Vert.x Mailer。 使用的配置:
quarkus.mailer.host=smtp.office365.com
quarkus.mailer.keep-alive-timeout=PT60S
quarkus.mailer.keep-alive=true
我们遇到的问题是在发送邮件 60 秒后会记录以下内容:
2021-11-25T09:48:58.477+0100 ERROR [vert.x-eventloop-thread-2] io.vertx.ext.mail.impl.SMTPConnection Connection reset: java.net.SocketException: Connection reset
at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:367)
at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:398)
at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132)
at io.netty.channel.socket.nio.NiosocketChannel.doReadBytes(NioSocketChannel.java:350)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:832)
: java.net.SocketException: Connection reset
at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:367)
at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:398)
at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132)
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:832)
基于此堆栈跟踪,它看起来像是 smtp.office365.com 执行 Connection reset
,Vert.x 的 SMTPConnection should close gracefully 中的超时处理。
有人有过这样的经历吗?
静默 SMTPConnection 的日志记录是一个选项,但这似乎不对。
【问题讨论】:
这是发生这种情况时的常规异常。有什么理由使用长时间运行的连接?如果您使用复制器打开问题,我可以看看我们是否可以以更优雅的方式捕获异常。 【参考方案1】:我在单步执行代码后的解释是SMTPConnection.quitCloseConnection 缺少关闭实际连接的调用。
所以QUIT
被发送,然后smtp-server 发送connection reset
因为连接没有关闭。
我在vert.x mail client 中创建了一个问题。
【讨论】:
以上是关于在保持活动超时时为 Vert.x 邮件发送器重置连接的主要内容,如果未能解决你的问题,请参考以下文章