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

我编写了Java应用程序,它将消息发送到RabbitMQ。 然后Flume从RabbitMQ队列中选择消息。 我感兴趣的是没有人从队列中拉出消息,除了水槽。

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

问题:

使用下面的代码,消息进入RabbitMQ队列并永远保持“未知状态”。 据我所知,RabbitMQ正在等待来自MessageListener的ACK,但MessageListener绝不会确认。 有谁知道如何解决它?

代码:

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());
     }


}

如果您不想要确认每条消息,则可以通过在SimpleMessageListenerContainer上设置AcknowledgeMode

container.setAcknowledgeMode(AcknowledgeMode.NONE);

请参阅API参考以获取更多信息。

更新:应该是AcknowledgeMode.NONE

设置为AcknowledgeMode.NONE告诉经纪人不要期待任何确认,并且假定所有消息在发送后立即得到确认(这是以原生Rabbit经纪人条款“自动支付”)。 如果是AcknowledgeMode.NONE,那么通道不能是事务性的(因此如果该标志意外设置,容器将在启动时失败)。


这里是引导阅读解决方案的讨论:

http://forum.springsource.org/showthread.php?129304-Spring-AMQP-would-like-to-put-message-to-queue-and-send-ACK-immediately&p=422064&posted=1#post422064

链接地址: http://www.djcxy.com/p/59641.html

上一篇: Spring AMQP: would like to put message to queue and send ACK immediately

下一篇: Sending multiple attachment in an email using PHP