Spring AMQP:希望将消息放入队列并立即发送ACK

时间:2012-08-14 11:40:57

标签: java spring rabbitmq amqp spring-amqp

我编写了Java应用程序,它向RabbitMQ发送消息。 然后Flume从RabbitMQ队列中选择消息。 我很感兴趣,除了水槽之外,没有人从队列中提取消息。

我的应用程序使用Spring AMQP Java插件。

问题:

使用下面的代码,消息进入RabbitMQ队列并永远保持“Unknowledges”。 据我所知,RabbitMQ正在等待来自MessageListener的ACK,但MessageListener永远不会发出ACK。 有人知道如何解决它吗?

代码:

public class MyAmqpConfiguration {

    @Autowired
    ConnectionFactory connectionFactory;

    @Bean
    public SimpleMessageListenerContainer messageListenerContainer() {

    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
    container.setQueues(activityLogsQueue());
    container.setMessageListener(MyMessageListener());
            container.setConcurrentConsumers(3);

    return container;
    }

        @Bean(name="myTemplate")
        public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setMessageConverter(MyMessageConverter());
        return template;
        }
}


public class MyMessageListener implements MessageListener {


   public MyMessageListener(MessageConverter converter, MyMessageHandler<MyObject> messageHandler) {
      this.converter = converter;
      this.messageHandler = messageHandler;
    }

   @Override
   public void onMessage(Message message) {
     this.messageHandler.doThings();
   }

}

public class MyMessageHandler  {

     @Autowired
     @Qualifier("myTemplate")
     RabbitTemplate template;

     @Override
     public void handleMessage(MyObject thing) {
         template.convertAndSend(exchange, routingKey, thing);
     }

}


public class MyMessageConverter extends JsonMessageConverter {

    @Override
     protected Message createMessage(Object object, MessageProperties messageProperties) { 
        //do things
     }

     @Override
     public Object fromMessage(Message message) throws MessageConversionException {
         throw new UnsupportedOperationException("fromMessage is not supported in "+this.getClass().getName());
     }


}

2 个答案:

答案 0 :(得分:4)

如果您不想确认每条消息,那么您可以通过执行

在SimpleMessageListenerContainer上设置AcknowledgeMode
container.setAcknowledgeMode(AcknowledgeMode.NONE);

请查看API reference以获取更多信息。

更新:应该 AcknowledgeMode.NONE

  

设置为AcknowledgeMode.NONE以告诉代理不要期待任何确认,并且它将假定所有消息一发送就被确认(这是本地Rabbit代理术语中的“autoack”)。如果AcknowledgeMode.NONE那么通道不能是事务性的(因此如果意外设置了该标志,容器将在启动时失败)。

答案 1 :(得分:0)