package jnpf.elnService.template; import org.springframework.stereotype.Component; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.support.TransactionTemplate; import java.util.function.Consumer; import java.util.function.Supplier; @Component public class ElnTemplateBindingConfirmationFacade { private final TransactionTemplate stateTransactionTemplate; private final TransactionTemplate failureAuditTransactionTemplate; public ElnTemplateBindingConfirmationFacade(PlatformTransactionManager transactionManager) { stateTransactionTemplate = requiresNew(transactionManager); failureAuditTransactionTemplate = requiresNew(transactionManager); } public void execute(Runnable stateAction, Consumer failureAudit) { execute(() -> { stateAction.run(); return null; }, failureAudit); } public T execute(Supplier stateAction, Consumer failureAudit) { try { return stateTransactionTemplate.execute(status -> stateAction.get()); } catch (RuntimeException stateFailure) { try { failureAuditTransactionTemplate.executeWithoutResult( status -> failureAudit.accept(stateFailure)); } catch (RuntimeException auditFailure) { stateFailure.addSuppressed(auditFailure); } throw stateFailure; } } private static TransactionTemplate requiresNew(PlatformTransactionManager manager) { TransactionTemplate template = new TransactionTemplate(manager); template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); return template; } }