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,

Author: sampath, 2014-06-27

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:

  1. Utilisez un bean de session sans état comme temporisateur bean
  2. Définir un verrou de lecture sur la méthode timer
  3. 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.
 6
Author: Robert Panzer, 2014-06-27 04:41:30