具有嵌套调用的Spring TransactionTemplate

时间:2015-02-25 14:06:00

标签: java spring spring-transactions

我是一个复杂交易场景的应用程序。

我做了很多交易的任务。我尝试简化它以向您展示这个概念:

我是一个主要任务,为从db中提取的每个约会打开一个事务:

@Component
public class MainTask {

@Inject
TransactionTemplate transactionTemplate;

@Scheduled(cron = "*/30 * * * * ?")
public void execute() { 

List<Long> appointments = new ArrayList<Long>();

transactionTemplate.execute(status -> {
            try {                   
                appointments= communicationClass.loadAppointments();

            } catch (Exception e) {
                log.error("", e);
                status.setRollbackOnly();
            }
            return null;
        });

appointmens.parallelStream().forEach(id -> {
            transactionTemplate.execute(status -> {
                try {

                    communicationClass.evaluateSms(id);

                } catch (Exception e) {
                    log.error("", e);
                    status.setRollbackOnly();
                }
                return null;
            });

这是CommunicationClass:

@Component
public class CommunicationClass{

         @PersistenceContext
         EntityManager entityManager;

  public List<Long> loadAppointments() {
           //CALL A SERVICE TO GET THE LIST OF APPOINTMENTS
           return appointmentService.loadAppointments();
  }


      public void evaluateSms(long idAppuntamento) {
         boolean orarioSms = templateServiceImpl.canInviaSms(template, appuntamento);

        //REMOTE CALL
        boolean esitoInvio = inviaSmsGateway(appuntamento, sms, template);
                if (esitoInvio == false)
                    throw new RuntimeException("Rollback of the entire transaction");
 }

这是之前使用的TemplateServiceImpl类:

@Service
@Transactional
 public class TemplateServiceImpl {

 public boolean canInviaSms(Template template, IHasComunicazioni oggetto) {
    //DO SOMETHING WITH OBJECTS RECEIVED
}

我的问题是:

  1. 当调用communicationClass以及稍后调用该服务时,还会保留从transactionTemplate打开的事务(使用@Transactional注释)?
  2. 在evaluateSms()中抛出的RuntimeException应该回滚在for()中打开的整个事务,对吗?
  3. 如果在方法内部抛出异常,则TemplateServiceImpl的canInviaSms()会回滚整个事务吗?
  4. 谢谢

0 个答案:

没有答案