【问题标题】:RabbitMQ delete queue can not release connectionRabbitMQ 删除队列无法释放连接
【发布时间】:2016-11-13 14:18:54
【问题描述】:

在我的 java 程序中,某种消息正在通过 RabbitMQ 队列发送,如下所示:

 if(!con.isConnected()){
        log.error("Not connected !!!");

        return false;
}
con.getChannel().basicPublish("",queueName, MessageProperties.PERSISTENT_BASIC, bytes)
  1. 我通过 RabbitMQ 管理 GUI 插件删除了队列
  2. 尝试通过已删除的队列发送消息

结果: 队列已从 RabbitMQ GUI 中删除,但是当我尝试通过已删除的 RabbitMQ 队列发送消息时,连接仍然有效。(con.isConnected() == true )我需要找到监听队列的方法,如果它被删除了,我不应该向已删除的队列发送任何消息。

注意:删除队列后,我并没有重启 RabbitMQ。

频道创建:

 channel = connection.createChannel();
 channel.queueDeclare(prop.getQueueName(), true, false, false, null);

示例代码通道、队列、交换创建:

ConnectionFactory cf = new ConnectionFactory();
    cf.setUsername("guest");
    cf.setPassword("guest");
    cf.setHost("localhost");
    cf.setPort(5672);
    cf.setAutomaticRecoveryEnabled(true);
    cf.setConnectionTimeout(10000);
    cf.setNetworkRecoveryInterval(10000);
    cf.setTopologyRecoveryEnabled(true);
    cf.setRequestedHeartbeat(5);
    Connection connection = cf.newConnection();

    channel = connection.createChannel();
    channel.queueDeclare("test", true, false, false, null);
    channel.exchangeDeclare("testExchange", "direct",true);
    channel.queueBind("test", "testExchange", "testRoutingKey");

    connection.addShutdownListener(new ShutdownListener() {

        @Override
        public void shutdownCompleted(ShutdownSignalException cause) {
            System.out.println("test"+cause);
        }
    });

发送消息:

            channel.basicPublish("testExchange", "testRoutingKey", null,messageBodyBytes);

【问题讨论】:

  • 请分享一些代码,以便我们可以 - 至少 - 尝试帮助您。
  • 我不确定代码块是否能帮助您了解情况,但无论如何我添加了它。
  • 请分享您连接队列的代码...
  • 请分享您传递给basicPublish的内容。 IIRC 您不能直接发布到队列,而只能发布到交换。如果该队列存在,默认交换允许您传递我猜的队列名称。另外一个连接和队列无关,所以如果你删除队列,连接仍然有效。
  • 据我了解,有一种方法可以将消息直接发送到相关队列,请查看 RabbitMQ Durability 部分:link

标签: java queue rabbitmq message-queue amqp


【解决方案1】:

来自 RabbitMQ 谷歌

AMQP 0-9-1 中的消息不会发布到队列中;它们被发布到交易所,从那里他们 是否路由到队列(或另一个交换器)。 [1] basic.publish 在设计上是一个完全异步的协议方法:没有响应 除非你要求 [2]。无法路由的消息可以返回给发布者 如果您定义返回侦听器并在强制标志设置为 true 的情况下发布。 请注意,发布者确认和强制标志/返回是正交的,并不意味着 另一个。

定义返回侦听器并设置强制标志为 true 解决了我的问题。如果任何消息未路由,我可以使用 ReturnListener 捕获它们并添加到我的持久队列中,以便在系统激活时再次发送。

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 2011-10-08
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2013-11-23
    • 2012-07-12
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多