RabbitMQ删除队列无法释放连接

时间:2016-07-11 15:03:31

标签: java queue rabbitmq message-queue amqp

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

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

        return false;
}
con.getChannel().basicPublish("",queueName, MessageProperties.PERSISTENT_BASIC, bytes)
  1. 我通过RabbitMQ管理GUI插件删除了队列
  2. 尝试通过已删除的队列发送消息
  3. 结果:队列已从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);
    

1 个答案:

答案 0 :(得分:0)

来自RabbitMQ谷歌

  

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

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