БД не фиксируется после потребления сообщения в Spring Cloud Stream связывателя концентратора событий Azure
У меня есть загрузочное приложение Spring для прослушивателя событий, которое выполняет операцию чтения из раздела концентратора событий Azure -> Сохранение события в БД. Я использовал Sink spring-cloud-azure-eventhubs-stream-binder(версия - 1.2.1) для прослушивания событий из моей темы, и он отлично работает. Однако это событие не сохраняется в БД. Когда я посмотрел на созданный JPA sql, там вообще нет операции вставки. Я мог видеть только выполнение запроса Select при сохранении JPA.
Я просто следил за примером в ссылке eventhubs-binder-sample.
@StreamListener(Sink.INPUT)
public void handleMessage(String message, @Header(AzureHeaders.CHECKPOINTER) Checkpointer checkpointer) {
System.out.println(String.format("New message received: '%s'", message));
myRepository.save(message); // No Insert operation triggered
}
Любая операция сохранения JPA, выполняемая внутри аннотированного метода @StreamListener, не вставляет данные в БД.
Любые подсказки приветствуются.. Я должен что-то сделать с синхронизацией транзакций (KafkaTransactionManager + JPATransactionManager), я полагаю, но не уверен..
1 ответ
Он заработал, потратив на это день. Создал новый JpaTransactionManager и использовал его для создания TransactionTemplate.
И выполнил свои операции с БД в новой транзакции, созданной из TransactionTemplate.
TransactionTemplate template = new TransactionTemplate(platformTransactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult()
{
@Override
protected void doInTransactionWithoutResult(TransactionStatus status)
{
myRepository.save(message);
}
});