У меня есть куча файлов, и в каждом файле есть куча объектов.Я хочу поместить все эти объекты в очередь, но хочу быть уверенным, что все объекты из одного файла приняты, поэтому я могу удалить его.Я добавил @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"));
}
К сожалению, транзакцияфиксируется, даже если максимальная длина превышена.
Можно ли откатить транзакцию, если сообщение отклонено из-за ограничения максимальной длины?