там про TransactionalEventListener всегда чуствую событие - PullRequest
0 голосов
/ 25 октября 2019

Я хочу использовать @TransactionalEventListener для получения после события отката, но, похоже, @TransactionalEventListener может получать все события независимо от метода транзакции.

слушатель:

@Slf4j
@Component
public class TransactionListener {

    @TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK,classes = TransactionEvent.class)
    public void onEventHandler(TransactionEvent event) {
        log.info("after rollback. event = {}", event);
    }

}

тест:

@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class TaskAutoRepoTest {

    @Autowired
    private ApplicationEventPublisher publisher;

    @Test
    public void saveTest() throws InterruptedException {

        publisher.publishEvent(new TransactionEvent("name", "sssssss"));
        Thread.sleep(1000);
    }
}

при выполнении теста TransactionListener всегда получает журнал событий и распечатывает.

1 Ответ

0 голосов
/ 25 октября 2019

Вместо того, чтобы вставлять код в текст, рассмотрите возможность поделиться реальным примером, который могут запустить другие. Если у вас есть учетная запись GitHub, очень легко создать репо и скопировать / вставить этот материал в небольшой проект, созданный из start.spring.io.

Я сделал это, и он работает, как и ожидалось,см. https://github.com/snicoll-scratches/test-so-58552671

Обратите внимание, что я сохранил часть Thread.sleep, но вам не следует делать это, если транзакция была запущена за пределами этого метода, так как режим сна не позволит завершить транзакцию.

В любом случае, приведенный выше код не соответствует тому, что вы утверждаете, поэтому должно быть что-то еще. Вы можете посмотреть пример проекта и отправить ему пиар с вашим изменением, если вы все еще можете воспроизвести эту проблему.

РЕДАКТИРОВАТЬ: Спасибо за предоставление пиара для моего оригинального образца. Ваша установка вообще не использует управление транзакциями (нет поддержки транзакций, нет активного менеджера транзакций). TransactionalEventListener - это EventListener, поэтому событие будет передано как есть. Я добавил @EnableTransactionManagement к вашему PR, и с инфраструктурой транзакций все работает как положено.

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