package fr.openwide.core.jpa.business.generic.service; import java.util.concurrent.Callable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.interceptor.DefaultTransactionAttribute; import org.springframework.transaction.interceptor.TransactionAttribute; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; @Service public class TransactionScopeIndependantRunnerServiceImpl implements ITransactionScopeIndependantRunnerService { private TransactionTemplate readOnlyTransactionTemplate; private TransactionTemplate writeTransactionTemplate; @Autowired public void setPlatformTransactionManager(PlatformTransactionManager transactionManager) { DefaultTransactionAttribute readOnlyTransactionAttribute = new DefaultTransactionAttribute(TransactionAttribute.PROPAGATION_REQUIRES_NEW); readOnlyTransactionAttribute.setReadOnly(true); readOnlyTransactionTemplate = new TransactionTemplate(transactionManager, readOnlyTransactionAttribute); DefaultTransactionAttribute writeTransactionAttribute = new DefaultTransactionAttribute(TransactionAttribute.PROPAGATION_REQUIRES_NEW); writeTransactionAttribute.setReadOnly(false); writeTransactionTemplate = new TransactionTemplate(transactionManager, writeTransactionAttribute); } @Override public <T> T run(final Callable<T> callable) { return run(true, callable); } @Override public <T> T run(boolean readOnly, final Callable<T> callable) { TransactionTemplate transactionTemplate = readOnly ? readOnlyTransactionTemplate : writeTransactionTemplate; return transactionTemplate.execute(new TransactionCallback<T>() { @Override public T doInTransaction(TransactionStatus transactionStatus) { try { return callable.call(); } catch (Exception e) { if (e instanceof InterruptedException) { Thread.currentThread().interrupt(); } throw new IllegalStateException(String.format("Erreur durant l'execution du callable %s", callable), e); } } }); } }