如何使用SimpleMessageListenerContainer bean从RabbitMq队列中破坏性地读取消息

时间:2016-06-21 04:07:58

标签: rabbitmq spring-amqp spring-rabbitmq

我需要一个帮助来实现一个SimpleMessageListenerContainer,它会在消息接收者读取后立即以非事务方式删除消息。

在我的情况下,无论事务成功或不成功,放入队列的消息都会挂起(不在队列中),并在从队列中读取的每个操作上重复处理。因此,放入队列的所有其他消息仍然无法访问,每次只重新处理第一个消息。

另一个奇怪的是,我无法看到队列中的消息登陆/排队,即Rabbit管理控制台上的队列深度永远不会改变,而只是消息率在每次写入队列时都会跳转。

以下是我的Java配置的代码片段。如果有人能在这里指出错误,将会有很大的帮助: -

@Configuration
@EnableJpaRepositories(basePackages={"com.xxx.muppets"})
public class MuppetMessageConsumerConfig {

private ApplicationContext applicationContext;
@Value("${rabbit.queue.name}")
private String queueName;

@Autowired
public void setApplicationContext(ApplicationContext applicationContext) {
    this.applicationContext = applicationContext;
}

@Bean
Queue queue() {
    return new Queue(queueName, false);
}

@Bean
TopicExchange exchange() {
    return new TopicExchange("spring-boot-exchange");
}

@Bean
Binding binding(Queue queue, TopicExchange exchange) {
    return BindingBuilder.bind(queue).to(exchange).with(queueName);
}

@Bean
MuppetMsgReceiver muppetMsgReceiver(){
    return new MuppetMsgReceiver();
}

@Bean
MessageListenerAdapter listenerAdapter(MuppetMsgReceiver muppetMsgReceiver){
    return new MessageListenerAdapter(muppetMsgReceiver, "receiveMessage");
}

@Bean
SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setAcknowledgeMode(NONE);
    container.setConnectionFactory(connectionFactory);
    container.setQueueNames(queueName);
    container.setMessageListener(listenerAdapter);
    return container;
}
}

我的留言接收器类如下:

public class MuppetMsgReceiver {

private String muppetMessage;

private CountDownLatch countDownLatch;

public MuppetMsgReceiver() {
    this.countDownLatch = new CountDownLatch(1);
}

public MuppetMsgReceiver(CountDownLatch latch) {
    this.countDownLatch = latch;        
    CountDownLatch getCountDownLatch() {
    return countDownLatch;
}

public void receiveMessage(String receivedMessage) {
    countDownLatch.countDown();
    this.muppetMessage = receivedMessage;
}

public String getMuppetMessage() {
    return muppetMessage;
}
}

这个完整的代码基于Spring的getting started example,但由于队列中的非破坏性读取而没有帮助。

1 个答案:

答案 0 :(得分:0)

AcknowledgeMode=NONE表示经纪人一旦向消费者发送消息就会收到消息,而不是在消费者收到消息时,因此您观察到的行为对我没有意义。使用此确认模式是非常不寻常的,但消息一发送就会消失。这可能是您的代码的问题。 TRACE日志记录将帮助您了解正在进行的操作。