Я пытаюсь использовать канал Transactionnal RabbitMQ с Spring-AMQP, но я хочу фактически проглотить исключения, чтобы регистрировать их и иметь возможность их восстанавливать.
Использование channelTranscted = true заставляет канал также присоединиться к текущему транзакционному менеджеру (в моем случае - Hibernate), и это приводит к тому, что исключение фиксации повторно выбрасывается за пределы границ @Transactionnal, что приводит к сбою на верхнем уровне без возможности его перехвата и регистрации. Это.
Я также попытался вручную прикрепить публикацию к транзакции, чтобы она выполнялась только после успешной фиксации:
public void publishFailSafeAfterSuccessfulTransaction(final String routingKey, final String message) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
try {
rabbitTemplate.convertAndSend(routingKey, message);
} catch (Exception exception) {
logger.error("Error while publishing message to RabbitMQ ");
}
}
});
используется таким образом:
Entity entity = save(entity);
publishFailSafeAfterSuccessfulTransaction("routingkey", "Entity was updated");
но в этом случае я не могу использовать channelTranscted = true, потому что он вложит registeringSynchronization в другую registeringSynchronization и вообще не сможет быть вызван ...
Есть ли способ этого достичь?
ОБНОВЛЕНИЕ: в идеале я бы хотел переопределить RabbitResourceSynchronization, который используется в классе ConnectionFactoryUtils, но это частный класс без фабрики, созданной с помощью
TransactionSynchronizationManager.registerSynchronization(new RabbitResourceSynchronization(resourceHolder, connectionFactory, synched));