Invocation de beans dans une méthode asynchrone
Bonjour,
J'ai développé un SI avec Glassfish + Postgresql, dont un des services appel un bean singleton TraitementManager qui utilise une méthode asynchrone. Cette méthode appel un Bean Managed Transaction pour mettre à jour le status du traitement. Voici en gros le code utilisé:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
@Stateless
@LocalBean
public class GestionTraitement implements IGestionTraitement{
@EJB private TraitementManager manager;
public void traitement(String traitement, String user, String objettraité){
manager.startTraitement(traitement, user, objettraité);
}
}
@Singleton
@LocalBean
public class TraitementManager{
@EJB TraitementBMT traitementBMT;
@Asynchronous
public void startTraitement(String traitement, String user, String objettraité){
List<Traitement> list = traitementBMT.getTraitements();
for(Traitement t:list){
traitementBMT.updateStatut(t,"en cours");
//execute traitement
traitementBMT.updateStatut(t,"fini");
}
}
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
@LocalBean
public class TraitementBMT{
@Resource UserTransaction utx;
@PersistenceContext(unitName="ejbPU") EntityManager entityManager;
public List<Traitement> getTraitements(){
Query query =....
...
List l = query.getResutlList();
return (List<Traitement>) l;
}
public void updateStatut(Traitement t, String statut){
utx.begin();
t.setStatut(status);
entityManager.merge(t);
utx.commit();
}
} |
Mon problème c'est qu'à partir de la méthode asynchrone, l'injection ne fonctionne plus. utx et entityManager sont null losque j'arrive dans la classe TraitementBMT.
J'ai déjà tester plusieurs solution, notamment en appelant la classe par un new InitialContext puis initialContext.lookup(nomJNDI) mais ca ne marche pas non plus.
Merci pour toutes informations qui m'aiguillerai dans le bon sens.
Loïc