【问题标题】:RabbitMQ Connection close after call channel.close()调用 channel.close() 后 RabbitMQ 连接关闭
【发布时间】:2017-05-28 19:12:16
【问题描述】:

我正在使用 Java RabbitMQ 客户端。我发布一条消息(basicPublish),然后关闭频道。在 Consumer 中,channel.basicAck 抛出异常:

com.rabbitmq.client.AlreadyClosedException: connection is already closed due to connection error; cause: java.util.concurrent.RejectedExecutionException: Task com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable@665de7c7 rejected from java.util.concurrent.ThreadPoolExecutor@35f53993[Running, pool size = 5, active threads = 5, queued tasks = 0, completed tasks = 5]

如果删除 channel.close(),错误不会重现。当我关闭频道时,为什么连接会关闭?

发送消息交换:

Channel channel = connection.createChannel();
Set<String> expectedMessages = new HashSet<>(MESSAGES_COUNT);
for (int i = 0; i < MESSAGES_COUNT; i++) {
    String message = Integer.toString(i);
    channel.basicPublish(
        TEST_EXCHANGE,
        ROUTE_KEY,
        TEXT_PLAIN,
        message.getBytes("UTF-8")
    );
    expectedMessages.add(message);
}
channel.close();

消费者:

try {
    channel.basicAck(deliveryTag, false);
} catch (Exception e) {
    log.error("Error during message handling: " + consumerTag, e);
    channel.basicNack(deliveryTag, false, true);
}

【问题讨论】:

  • 当你关闭频道时你并没有关闭连接,你的代码中可能还有另一个错误。
  • 这种行为的原因是什么?我可以不关闭频道吗?
  • 没有代码很难知道!

标签: java rabbitmq


【解决方案1】:

问题出在错误的 connectionFactory 设置中。 不正确:

    executorService = new ThreadPoolExecutor(
            properties.minThreads, properties.maxThreads,
            properties.maxThreadIdle, TimeUnit.SECONDS,
            new SynchronousQueue<>()
    );
    connectionFactory.setSharedExecutor(executorService);

为了正确的工作:

    executorService = new ThreadPoolExecutor(
            properties.minThreads, properties.maxThreads,
            properties.maxThreadIdle, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>()
    );
    connectionFactory.setSharedExecutor(executorService);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多