Bonjour à tous,
J'ai besoin d'un petit coup de main chers confrères!
Voilà dans mon projet j'ai un Session Bean @Stateless dont une méthode @Scheduled s'exécute tout les lundi à minuit.
Ce Bean s'appuie sur un autre Bean style service permettant la création d'objet en base.
La méthode est assez longue à se terminer et fait beaucoup d'appels au service pour créer des objets avec JPA.
Voici mes objets:
Le problème est que la méthode planifiée est trop longue, la transaction contenant les persist des objets se met en timeout et du coup, aucune requête SQL ne s’exécute.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 @Stateless public class TachePlanifiee implements TachePlanifieeLocal { @Inject private transient Logger logger; @EJB AppelService serviceAppel; @Schedule(second = "0", minute = "0", hour = "0", dayOfWeek = "Mon", dayOfMonth = "*", month = "*", year = "*", info = "MyTimer", persistent = false) private void scheduledTimeout() throws DAOException { //... code métier boucles etc. serviceAppel.createAppel(a, idClient); // ... code métier } } @Stateless public class AppelServiceImpl implements AppelService { @Inject ProspectionDAO daoP; @Inject AppelDAO daoA; @Inject @Mapper(businessObject=BusinessObject.APPEL) IMapper mapper; @Override public Appel createAppel(Appel a, Long prospectionId) throws DAOException { Prospection prospect = daoP.find(prospectionId); a.setProspection(prospect); a.setCommercialEnCharge(prospect.getCommercial().getCommercialEnCharge()); prospect.getAllAppels().add(a); return daoA.create(a); } }
Ce que je voudrais, c'est désactiver la transaction de la méthode planifiée et utiliser uniquement les transactions des méthodes du service.
J'ai lu que les méthodes planifiées sont obligatoirement transactionnelles par contre... Y aurait-il peut être une autre façon de faire avec CDI?
Merci beaucoup!
Partager