Spring RabbitMQ事务和队列溢出

时间:2018-12-04 13:22:32

标签: rabbitmq spring-rabbitmq

我有一堆文件,每个文件中都有一堆对象。我想将所有这些对象放入队列,但是我要确保接受单个文件中的所有对象,因此可以将其删除。我在发布消息的方法中添加了@Transactional注释:

public class Sender {

  @Autowired
  private RabbitTemplate template;

  @Autowired
  private Queue queue;

  public Sender(RabbitTemplate template) {
    this.template = template;
    template.setChannelTransacted(true);
  }


  @Transactional
  public void send(List<String> messages) {
    messages.forEach(msg -> template.convertAndSend(queue.getName(), msg));
  }

}

一切正常-在send(List<String> messages)方法中的某个地方抛出异常时,将执行回滚。但是我还想限制队列的最大大小,因为我知道发布者发布消息的速度远远快于消费者能够使用它们的速度,因此我在队列中添加了max-length参数:

@Bean
  public Queue queue() {
    return new Queue("test", true, false, false, Map.of("x-max-length", 3, "overflow", "reject-publish"));
  }

不幸的是,即使超过了最大长度,事务也会被提交。

由于最大长度限制而导致邮件被拒绝时,是否可以回滚事务?

1 个答案:

答案 0 :(得分:1)

根本原因是overflow参数而不是x-overflow。默认的溢出策略是删除最旧的消息,因此一切都如预期。