在保持活动超时时为 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 邮件发送器重置连接的主要内容,如果未能解决你的问题,请参考以下文章

选择未发送时事通讯的用户

如何在会话超时时关闭所有活动的引导模式?

休眠反应在 aws rds 中没有活动的 Vert.x 上下文

活动预告Vert.x开发框架介绍

深入浅出Vert.x架构

会话超时时,如何从 Spring Security 向 angularjs 应用程序发送响应?