我要解决的问题背景:我有一个 java spring http 拦截器 AuditHttpCommunicationInterceptor ,它审计与外部系统的通信。进行通信的 HttpClieant 用于执行某些称为 DoBusinessLogicService 的业务逻辑的 java 服务类。DoBusinessLogicServices 打开一个新事务并使用几个协作者来做很多事情。
要解决的问题:无论 DoBusinessLogicSevice 中的任何操作的结果(意外异常等)如何,我都希望通过 AuditHttpCommunicationInterceptor 将审核存储在数据库中。
我使用的解决方案: AuditHttpCommunicationInterceptor 将以这种方式打开一个新事务:
TransactionDefinition transactionDefinition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
new TransactionTemplate(platformTransactionManager, transactionDefinition).execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
// do stuff
}
});
一切正常。当 DoBusinessLogicSevice 的一部分抛出意外异常时,它的事务被回滚,但 AuditHttpCommunicationInterceptor 设法将审计存储在数据库中。
此解决方案产生的问题: AuditHttpCommunicationInterceptor 使用新的数据库连接。因此,对于每个 DoBusinessLogicService 调用,我需要 2 个数据库连接。基本上,我想知道问题的解决方案:如何让 TransactionTemplate “暂停”当前事务并在这种情况下将连接重用于新的事务。
有任何想法吗?:)
PS 一个想法可能是采用不同的设计方法:删除拦截器并创建一个直接在 DoBusinessLogicSevice 中使用的 AuditingHttpClient(不是由 spring 调用的),但我不能这样做,因为我无法访问那里的所有 http 字段。