Я использую BlockingQueue для передачи элементов от поставщика к потребителю, и он отлично работает.
Чтобы откатить операции с базой данных при возникновении исключений, я добавляю аннотацию @Transactional (rollbackFor = Exception.class)к функции провайдера.Неожиданно это останавливает потребителя от чтения любых элементов из очереди.
Поставщик всегда может успешно поместить элемент в очередь, но потребитель никогда не сможет извлечь элемент из очереди.
Удаление аннотации @Transactional или помещение элементов в очередь вне помеченного метода @Transactional устранят проблему.
Вот псевдокод Java
blockingQueue = new BlockingQueue();
// consumer code
while (true) {
// take a element
blockingQueue.take();
}
// provider code
// after removing the annotation the consumer works fine
@Transactional(rollbackFor = Exception.class)
provideElement() {
// put a element
blockingQueue.put();
}
Я обхожу проблему, перемещая метод put из фрагмента кода @Transactional.Но мне все еще любопытно: почему добавление аннотации @Trasactional мешает потребителю брать элементы из очереди блокировки?