2011-11-18 12 views
44

sto ottenendo questa eccezione sul mio server Tomcat (+ Liferay)Quale potrebbe essere la causa di RejectedExecutionException

java.util.concurrent.RejectedExecutionException 

mia classe è così:

public class SingleExecutor extends ThreadPoolExecutor { 
    public SingleExecutor(){ 
    super(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()); 
    } 

    @Override 
    public void execute(Runnable command) { 
    if(command instanceof AccessLogInsert){ 
     AccessLogInsert ali = (AccessLogInsert)command; 
     ali.setConn(conn); 
     ali.setPs(ps); 
    } 
    super.execute(command); 
    } 
} 

ottengo questa eccezione sulla linea super.execute(command); Questo errore si può verificare quando la coda è piena ma la dimensione LinkedBlockingQueue è 2^31 e sono sicuro che non ci siano molti comandi in attesa.

All'inizio tutto è stabile, ma dopo aver ridistribuito una guerra inizia. Questa classe non fa parte della guerra ma in un vaso in tomcat/lib.

Avete idea del motivo per cui è successo e come risolverlo?

risposta

54

Da ThreadPoolExecutor JavaDoc

Nuovi compiti presentate metodo execute(java.lang.Runnable) saranno respinti quando il Executor è stato chiuso, e anche quando il Executor usa limiti finiti per entrambi i fili massimo e capacità coda di lavoro, ed è saturata . In entrambi i casi, il metodo execute richiama il metodo RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) del suo RejectedExecutionHandler. Sono disponibili quattro criteri predefiniti del gestore:

  1. Nel predefinita ThreadPoolExecutor.AbortPolicy, il conduttore lancia un runtime RejectedExecutionException su di rifiuto.
  2. In ThreadPoolExecutor.CallerRunsPolicy, il thread che richiama execute esegue l'attività. Ciò fornisce un semplice meccanismo di controllo di feedback che rallenta la velocità con cui vengono inviate nuove attività.
  3. In ThreadPoolExecutor.DiscardPolicy, un'attività che non può essere eseguita viene semplicemente eliminata.
  4. In ThreadPoolExecutor.DiscardOldestPolicy, se l'esecutore non viene arrestato, il compito alla testa della coda di lavoro è caduto, e quindi l'esecuzione viene ritentata (che può fallire di nuovo, causando questo da ripetere.)

È possibile definire e utilizzare altri tipi di classi RejectedExecutionHandler. Fare ciò richiede un po 'di attenzione, specialmente quando le politiche sono progettate per funzionare solo con particolari capacità o politiche di accodamento.

Quindi, presumibilmente, ricaricare la guerra provoca l'arresto di Executor. Prova a mettere le librerie pertinenti in guerra, in modo che il numero ClassLoader di Tomcat abbia una migliore possibilità di ricaricare correttamente la tua app.

+1

L'ultima parte della risposta è bella. –

Problemi correlati