【问题标题】:Stop queue listening RabbitMQ using java使用java停止队列监听RabbitMQ
【发布时间】:2015-02-22 04:55:52
【问题描述】:

您好,我在我的 java 应用程序中使用 rabbitMQ。当我停止应用程序时,我需要确保在停止应用程序之前停止队列侦听器(停止从队列接收消息)。 我不确定是否需要调用 channel.close()channel.basicCancel("tag")。 编写以下代码以停止队列侦听。

if(myContext.myChannel.isOpen()){ 

  //myChannel is the one I am using to listen to queue 
  myContext.myChannel.basicCancel("OP"); 

  //myContext.myChannel.close(); 
}else{ 
   return ok("Channel is not open"); 
}

【问题讨论】:

  • 如果您需要帮助,请显示一些代码。阅读手册。
  • 在停止我的应用程序时我在下面的代码if(myContext.myChannel.isOpen()){ //myChannel is the one I am using to listen to queue myContext.myChannel.basicCancel("OP"); //myContext.myChannel.close(); }else{ return ok("Channel is not open"); }
  • 嗨 Manoj,我也面临同样的问题,你能帮我获取“myContext”对象吗?如果你分享对我有很大帮助的代码。谢谢

标签: java rabbitmq message-queue


【解决方案1】:

如果你想停止监听器,你必须:

 Connection connection = factory.newConnection();
 Channel channel = connection.createChannel();
 channel.queueDeclare("myQueue", false, false, false, null);
 MyConsumer consumer = new MyConsumer(channel);
 String consumerTag = channel.basicConsume("myQueue", false, consumer);
 System.out.println("press any key to terminate");
 System.in.read();

 channel.basicCancel(consumerTag);<----- this stop listening
 channel.close(); <--- this close the channel and eventually all listening
 connection.close();<-- this close the connection and all channels 

请阅读此关于"isOpen" 方法:https://www.rabbitmq.com/api-guide.html

不使用通道和连接对象的 isOpen() 方法 推荐用于生产代码,因为返回的值 方法取决于是否存在关闭原因。

【讨论】:

  • 谢谢。 basicCancel("tag") 与我的案例一起使用。在停止应用程序之前,我设法停止了队列侦听。
  • @manojprasanna ,但是如何在它正在监听的代码的不同部分中获取 consumerTag 和相同的频道?
【解决方案2】:

如果您使用的是 AMQP/Rabbit,您可以尝试以下方法之一:

@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);

    //
    //autoStartup = false, prevents handling messages immedeatly. You need to start each listener itselve. 
    //
    factory.setAutoStartup(false); 

    factory.setMessageConverter(new Jackson2JsonMessageConverter());
    return factory;
}

或在 app.yml/props 中:

rabbitmq.listener.auto-startup: false
rabbitmq.listener.simple.auto-startup: false

或: 给你的@RabbitListener 一个 id

@RabbitListener(queues = "myQ", id = "myQ")
...

和:

@Autowired
private RabbitListenerEndpointRegistry rabbitListenerEndpointRegistry;

MessageListenerContainer listener = 
   rabbitListenerEndpointRegistry.getListenerContainer("myQ");
    ...
listener.start();
...
listener.stop();

【讨论】:

    猜你喜欢
    • 2020-11-07
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2016-03-12
    • 2017-07-30
    • 1970-01-01
    相关资源
    最近更新 更多