当前位置: 首页 > 知识库问答 >
问题:

spring amqp:通道关闭,收到NACKS消息

万俟鸿波
2023-03-14

在RabbitMQ总线上使用带重载的spring amqp,我们有时会从org获取日志。springframework。amqp。兔子联系CachingConnectionFactory说:通道关闭:清洁通道关闭;协议方法:#方法

你能解释一下这个日志吗?为什么它处于错误级别?我们有什么调整吗?提前谢谢你的回答。

共有1个答案

弓俊晖
2023-03-14

如果所有发布者确认都没有随超时返回,则通道抛出异常...

@Override
public void waitForConfirmsOrDie(long timeout)
    throws IOException, InterruptedException, TimeoutException
{
    try {
        if (!waitForConfirms(timeout)) {
            close(AMQP.REPLY_SUCCESS, "NACKS RECEIVED", true, null, false);
            throw new IOException("nacks received");
        }
    } catch (TimeoutException e) {
        close(AMQP.PRECONDITION_FAILED, "TIMEOUT WAITING FOR ACK");
        throw(e);
    }
}

如果回复文本为OK,则DefaultChannelCloseLogger仅跳过正常关闭(200)。。。

/**
 * Return true if the {@link ShutdownSignalException} reason is AMQP.Channel.Close and
 * the reply code was AMQP.REPLY_SUCCESS (200) and the text equals "OK".
 * @param sig the exception.
 * @return true for a normal channel close.
 */
public static boolean isNormalChannelClose(ShutdownSignalException sig) {
    Method shutdownReason = sig.getReason();
    return isNormalShutdown(sig) ||
            (shutdownReason instanceof AMQP.Channel.Close
                && AMQP.REPLY_SUCCESS == ((AMQP.Channel.Close) shutdownReason).getReplyCode()
                && "OK".equals(((AMQP.Channel.Close) shutdownReason).getReplyText()));
}

如果要忽略这些错误,可以配置自定义关闭异常记录器:

/**
 * Set the strategy for logging close exceptions; by default, if a channel is closed due to a failed
 * passive queue declaration, it is logged at debug level. Normal channel closes (200 OK) are not
 * logged. All others are logged at ERROR level (unless access is refused due to an exclusive consumer
 * condition, in which case, it is logged at INFO level).
 * @param closeExceptionLogger the {@link ConditionalExceptionLogger}.
 * @since 1.5
 */
public void setCloseExceptionLogger(ConditionalExceptionLogger closeExceptionLogger) {
    Assert.notNull(closeExceptionLogger, "'closeExceptionLogger' cannot be null");
    this.closeExceptionLogger = closeExceptionLogger;
    if (this.publisherConnectionFactory != null) {
        this.publisherConnectionFactory.setCloseExceptionLogger(closeExceptionLogger);
    }
}
 类似资料:
  • 关闭通道的意思是该通道将不再允许写入数据。这个方法可以让通道数据的接受端知道数据已经全部发送完成了。 package main import "fmt" // 在这个例子中,我们使用通道jobs在main函数所在的协程和一个数据 // 接收端所在的协程通信。当我们数据发送完成后,我们关闭jobs通道 func main() { jobs := make(chan int, 5) d

  • 我对Netty是新手。我使用的是Netty 4.0.28。我指的是《Netty in Action》一书中提供的EchoServer示例。 一切正常。客户端在活动通道上向服务器发送消息,服务器打印接收到的消息并将相同的消息发回客户端。稍后客户端通道关闭,但服务器仍将侦听新连接。 我也想关闭服务器通道并将服务器绑定到新端口。 我应该如何关闭服务器通道?

  • 我所尝试的 我尝试将我的域添加到以下部分https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-http-settings-tls-sans.html#k8s-elasticsearch-http-service-san 我曾尝试使用openssl生成自签名证书,但没有成功。尝试本地连接将返回以下错误消息。 curl-u“弹性:$passw

  • 我有一个有状态的会话bean,我在那里发送和接收JMS消息。所有的连接设置都是手动处理的,因此bean包含javax.jms.connection和javax.jms.Session的实例。该bean还实现了MessageListener,使其能够接收消息。 注意:这是在Java EE环境(GlassFish4.0)中执行的 编辑:

  • 我有一个服务器,它在收到请求时需要使用goroutines从不同的流中读取消息,将它们发送到父goroutine,父goroutine将消息聚合并将它们发送到客户端。所以会是这样的: 我使用不同的通道在所有这些goroutine之间进行通信,工人可以写到聚合通道,处理程序(父goroutine)可以接收它并将其发送回客户机,所以一切都正常工作,几乎是:) 问题是我的工人没有收到由通道上的处理程序发

  • 问题内容: 我正在玩Golang,我创建了这个小应用程序,使用goroutines进行了多个并发的api调用。 当应用程序运行时,调用完成后,该应用程序将卡住,这是有道理的,因为由于通道未关闭,无法退出 范围c 循环。 我不确定在哪种情况下可以更好地关闭该通道。 问题答案: 当没有更多值要发送时,您将关闭通道,因此在这种情况下,所有goroutine已完成。 (请注意,from 仅将反映连接和协议