如何在分布式服务器环境中阻止侦听器从队列中侦听消息

时间:2015-05-22 13:14:37

标签: java rabbitmq amqp spring-amqp

我有3个不同服务器的监听器。在部署时,我在server1部署应用程序时,我希望server1的监听器停止监听新消息。但我希望监听器在此服务器上完成他们已经处理的任务。 我的Xml配置是 Rabbit.xml

<rabbit:connection-factory id="connectionFactory" host="localhost"     username="guest" password="guest" virtual-host="/"/>

<rabbit:template id="rabbitTemplate" connection- factory="connectionFactory" reply-timeout="10" />

<rabbit:admin connection-factory="connectionFactory" />

<rabbit:listener-container id="group"  connection-factory="connectionFactory" concurrency="10" error-handler="genericErrorHandler" >
 <rabbit:listener  ref="MailListener" method="listen" queue-names="promoMailQueue" />
</rabbit:listener-container>

要停止监听器,我试图停止SimplemessageListener。

   ClassPathXmlApplicationContext ctx;    
SimpleMessageListenerContainer messageListener;
public SimpleMessageListenerContainer getContainer(){
  ctx= new ClassPathXmlApplicationContext("Rabbit.xml")
  messageListener           (SimpleMessageListenerContainer)ctx.getBean("group");
  return messageListener;
}

public void getContainer(){
   SimpleMessageListenerContainer simpleMessageListenerContainer =    getContainer();
  simpleMessageListenerContainer.stop();
  simpleMessageListenerContainer.destroy();
}

我执行此操作仍然会在我的听众身上受到影响,请建议安全。

1 个答案:

答案 0 :(得分:1)

已经排队等待侦听器的任何消息都将在停止之前处理。默认预取为1,因此每个使用者(10个)将在stop()之后处理最多1个消息。

因此,虽然通常只会处理当前正在处理的消息,但有些新消息可能会启动;这一切都取决于时机。

将预取增加到1以上就更有可能。

启用DEBUG日志记录以检查行为。