Spring-AMQP で Transactionnal RabbitMQ チャネルを使用しようとしていますが、実際に例外を飲み込んでログに記録し、それらを回復できるようにしたいと考えています。
channelTransacted=true を使用すると、Channel が強制的に現在の transactionManager (私の場合は Hibernate) にも参加するようになり、その結果、commit Exception が @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");
しかし、その場合、channelTransacted=true を使用することはできません。これは、registeringSynchronization を別の registeringSynchronization 内にネストし、まったく呼び出されないためです...
これを達成する方法はありますか?
更新: 理想的には、 ConnectionFactoryUtils クラスで使用される RabbitResourceSynchronization をオーバーライドしたいのですが、これはファクトリがインスタンス化されていないプライベート クラスです。
TransactionSynchronizationManager.registerSynchronization(new RabbitResourceSynchronization(resourceHolder, connectionFactory, synched));