Ejb Timer lancio javax.ejb.ConcurrentAccessTimeoutException: impossibile ottenere il blocco di scrittura


La mia applicazione è in esecuzione su tomee e ho il timer ejb per attivare il metodo di timeout ogni due minuti. Il timer ha attivato il metodo di timeout per la prima volta ed è ancora in esecuzione quando il timer ha tentato di attivare lo stesso metodo per la seconda volta. E ha gettato la seguente eccezione..

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)

Tutto il mio registro è riempito con lo stesso stacktrace e continua a verificarsi fino a quando non arresto il server..

Possiamo fare in modo che il timerservice non inneschi il metodo se è già correre? o c'è un modo per timeout la prima chiamata prima che venga attivata di nuovo..

Grazie,

Author: sampath, 2014-06-27

1 answers

Il tuo EJB temporizzato è un bean singleton? Per impostazione predefinita, i single utilizzano la concorrenza gestita dal contenitore con blocchi di scrittura che garantiscono l'accesso esclusivo per tutti i metodi.

L'openejb.xml configura l'AccessTimeout per un EJB singleton. Dopo quel timeout verrà generata l'eccezione che hai visto. Vedi anche qui: http://tomee.apache.org/singleton-beans.html

Le soluzioni potrebbero essere:

  1. Usa un bean di sessione senza stato come timer fagiolo
  2. Definire un blocco di lettura sul metodo timer
  3. Non utilizzare un timer ripetuto ma pianificare l'esecuzione successiva del timer alla fine dell'esecuzione corrente.
 6
Author: Robert Panzer, 2014-06-27 04:41:30