Ejb Minuterie lancer javax.ejb.ConcurrentAccessTimeoutException: Impossible d'obtenir le verrouillage d'écriture
Mon application s'exécute sur tomee et j'ai le minuteur ejb pour déclencher la méthode timeout toutes les deux minutes. La minuterie a déclenché la méthode timeout la première fois et est toujours en cours d'exécution lorsque la minuterie a essayé de déclencher la même méthode pour la deuxième fois. Et il a jeté l'exception suivante..
javax.ejb.ConcurrentAccessTimeoutException: Unable to get write lock on 'timeout' method for: com.abc.xyz
at org.apache.openejb.core.singleton.SingletonContainer.aquireLock(SingletonContainer.java:298)
at org.apache.openejb.core.singleton.SingletonContainer._invoke(SingletonContainer.java:217)
at org.apache.openejb.core.singleton.SingletonContainer.invoke(SingletonContainer.java:197)
at org.apache.openejb.core.timer.EjbTimerServiceImpl.ejbTimeout(EjbTimerServiceImpl.java:769)
at org.apache.openejb.core.timer.EjbTimeoutJob.execute(EjbTimeoutJob.java:39)
at org.quartz.core.JobRunShell.run(JobRunShell.java:207)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:560)
Tout mon journal est rempli avec la même stacktrace et il continue de se produire jusqu'à ce que j'arrête le serveur..
Pouvons-nous faire en sorte que le timerservice ne déclenche pas la méthode si elle l'est déjà en cours d'exécution? ou existe-t-il un moyen de temporiser le premier appel avant qu'il ne soit à nouveau déclenché..
Merci,
1 answers
Votre EJB chronométré est-il un bean singleton? Par défaut, les singletons utilisent la simultanéité gérée par conteneur avec des verrous d'écriture qui garantissent un accès exclusif à toutes les méthodes.
L'openejb.xml configure l'AccessTimeout pour un EJB singleton. Après ce délai, l'exception que vous avez vue sera levée. Veuillez également voir ici: http://tomee.apache.org/singleton-beans.html
Les solutions pourraient être:
- Utilisez un bean de session sans état comme temporisateur bean
- Définir un verrou de lecture sur la méthode timer
- N'utilisez pas de minuterie répétitive mais planifiez la prochaine exécution de votre minuterie à la fin de l'exécution en cours.