2017-09-14 1 views
0

J'utilise un EJB avec une annotation @scheduled pour boucler toutes mes entités de contexte toutes les 10 secondes. Toutes les entités Contextes ne sont pas liés les uns aux autres et devrait donc créer de nouvelles transactions pour leur méthode de mise à jour:Boucle à l'intérieur de @Schedule avec de nouvelles transactions

@Stateless 
public class UpdateService { 

    @EJB 
    ContextDao contextDao; 

    @Schedule(second = "*/10", minute = "*", hour = "*") 
    public void update() { 
     for(ContextEntity context : contextDao.findAllContexts()) { 
      updateContext(context); 
     } 
    } 

    public void updateContext(ContextEntity context) { 
     // load data from db 
     // update some stuff 
     // save back to db 
    } 
} 

Maintenant, je veux avoir une seule transaction pour la méthode updateContext. Donc, si j'obtiens une erreur dans un ContextEntity, seule cette transaction devrait être annulée et non toute la boucle.

  1. Quels sont les attributs TransactionAttributes corrects pour update et UpdateContext?
  2. Dois-je utiliser un EJB différent pour la méthode updateContext?

Merci

+0

Ceci est une description utile et utile, mais je ne l'aurais pas trouvée. J'aurais cherché * imbriqué * ou * intégré * appelant * même * EJB ou quelque chose. Peut-être pourrait-il être renommé – aschoerk

Répondre

0

Je suppose que vous voulez appeler updateContext pas update dans la boucle.

La méthode update définie a l'attribut TransactionAttributeType.REQUIRED qui est le paramètre par défaut et peut être laissé de la même manière.

Le updateContext -method doit être annotées TransactionAttributeType.REQUIRES_NEW, mais ... si vous voulez appeler dans cette transaction contexte, vous devez utiliser

@Resource 
SessionContext sessionContext; 

chercher le businessinterface de sessionContext appeler updateContext

Par exemple, regardez SingletonEjb voir la méthode methodCallUsingSessionContext