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,
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:
- Usa un bean di sessione senza stato come timer fagiolo
- Definire un blocco di lettura sul metodo timer
- Non utilizzare un timer ripetuto ma pianificare l'esecuzione successiva del timer alla fine dell'esecuzione corrente.