Spring RabbitMQ транзакции и переполнение очереди - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть куча файлов, и в каждом файле есть куча объектов.Я хочу поместить все эти объекты в очередь, но хочу быть уверенным, что все объекты из одного файла приняты, поэтому я могу удалить его.Я добавил @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 голосов
/ 04 декабря 2018

Основной причиной был overflow параметр вместо x-overflow.Стратегия переполнения по умолчанию заключается в удалении самого старого сообщения, поэтому все соответствует ожидаемому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...