2016-04-06 23 views
0

Aynı hizmetin diğer işlem yöntemlerini çağıran işlem dışı ve eşzamansız bir yöntem var.Başka bir işlem yöntemini çağıran async yönteminde geri alma

Bir şey olursa bir istisna duyarsam, bir şey olursa hatayı kaydederim ancak geri alma işlemi çalışmaz.

Bu örnekte, Player hizmetinin kaydetme yöntemlerini çağırmak için işlem, oynatıcıyı kaydedin.

@Service 
@Transactional(readOnly = true) 
public class PlayerServiceImpl implements PlayerService { 

    @Inject 
    PlayerRepository playerRepository; 

    @Override 
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED) 
    public void save(PlayerEntity player) { 
     //more code here 
     playerRepository.save(player); 
    } 

    //other methods 
} 

Benim diğer hizmet:

@Service 
    public class TeamServiceImpl implements TeamService { 

     @Inject 
     TeamRepository teamRepository; 

     @Inject 
     MessageRepository messageRepository; 

     @Inject 
     ErrorRepository errorRepository;  

     @Inject 
     PlayerService playerService;  


     @Async("asyncExecutor") 
     @Override 
     public void saveWithPlayersAsync(TeamEntity team, User user) { 

      MessageEntity message = new MessageEntity(); 

      try { 

    //I want rollback this if something wrong happens 
       this.savePlayersA(team); 
       this.savePlayersB(team); 
       message.setContent("Ok !"); 
      } catch (TeamException e) { 
       //e.printStackTrace(); 
       message.setContent("Fail !");   
       message.setUser(user) 
//I save the error for audit 
       errorRepository.save(new Error("Fail", user.getCode())); 
      } finally { 
//always save message for user than execute de function 
       messageRepository.save(message); 
      } 

     } 

     @Transactional(readOnly = false, rollbackFor = TeamException.class) 
     private void savePlayersA(TeamEntity team) throws TeamException { 
      PlayerEntity p1 = new PlayerEntity(); 
      p1.setName("Name 1"); 
      p1.setSurname("Surname 1"); 
      p1.setTeam(team); 
      playerService.save(p1); 

      PlayerEntity p2 = new PlayerEntity(); 
      p2.setName("Name 2"); 
      p2.setSurname("Surname 2"); 
      p2.setTeam(team); 
      playerService.save(p2); 
     } 

     @Transactional(readOnly = false, rollbackFor = TeamException.class) 
     private void savePlayersB(TeamEntity team) throws TeamException { 
      PlayerEntity p3 = new PlayerEntity(); 
      p3.setName("Name 3"); 
      p3.setSurname("Surname 3"); 
      p3.setTeam(team); 
      playerService.save(p3); 

      PlayerEntity p4 = new PlayerEntity(); 
      p4.setName("Name 4"); 
      p4.setSurname("Surname 4"); 
      p4.setTeam(team); 
      playerService.save(p4); 

      // here something happens and throw my custom exception 
      if (true) { 
       throw new TeamException("Fail!"); 
      } 
     } 
    } 

neden değil geri alma? Ben rollbackFor istisna türü koydu.

cevap

0

Bunun sizin için geri dönüş yapmamasının nedeni, işlem yönteminizi çağıran async yönteminizin aynı sınıfta olmasıdır. Yöntemi @Transaction veya @Async ile eklediğinizde, ek açıklama kodu ilkbaharda yaratılan proxy tarafından işlenir. Açıklanan yöntem, aynı sınıfta olduğunda, onlara yapılan çağrı, vekaleten, ilk isteği yayından geçirme işlemiyle yakalanamaz ve bu nedenle yöntemdeki açıklama gereksizdir. SavePlayer yöntemlerini ayrı bir sınıfa taşıyarak ve orada işlem yöntemlerini kullanarak bunu yapabilirsiniz.

İlgili konular