2011-11-18 20 views
44

estoy recibiendo esta excepción en mi servidor Tomcat (+ liferay)¿Cuál podría ser la causa de RejectedExecutionException

java.util.concurrent.RejectedExecutionException 

mi clase es así:

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); 
    } 
} 

me sale esta excepción en la línea super.execute(command); Este error puede ocurrir cuando la cola está llena pero el tamaño LinkedBlockingQueue es 2^31, y estoy seguro de que no hay tantos comandos en espera.

Al inicio todo es estable, pero después de volver a desplegar una guerra, comienza a ocurrir. Esta clase no es parte de la guerra sino en un jar en tomcat/lib.

¿Tiene alguna idea de por qué sucedió esto y cómo solucionarlo?

Respuesta

54

De ThreadPoolExecutor JavaDoc

nuevas tareas presentadas en el método execute(java.lang.Runnable) serán rechazadas cuando el Executor se ha cerrado, y también cuando el Executor utiliza límites finitos para ambos hilos máximos y capacidad de la cola de trabajo, y está saturado . En cualquier caso, el método de ejecución invoca el método RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) de su RejectedExecutionHandler. Se proporcionan cuatro políticas predefinidas de controlador:

  1. En el defecto ThreadPoolExecutor.AbortPolicy, el guía lanza el tiempo de ejecución RejectedExecutionException al rechazo.
  2. En ThreadPoolExecutor.CallerRunsPolicy, el subproceso que invoca ejecutar se ejecuta la tarea. Esto proporciona un mecanismo de control de retroalimentación simple que ralentizará la velocidad con la que se envían las tareas nuevas.
  3. En ThreadPoolExecutor.DiscardPolicy, una tarea que no se puede ejecutar simplemente se descarta.
  4. En ThreadPoolExecutor.DiscardOldestPolicy, si el ejecutor no se apaga, la tarea a la cabeza de la cola de trabajo se deja caer, y luego se vuelve a intentar la ejecución (que puede fracasar de nuevo, haciendo que esta se repita.)

Es posible definir y usar otros tipos de clases RejectedExecutionHandler. Hacerlo requiere cierto cuidado, especialmente cuando las políticas están diseñadas para funcionar solo bajo una capacidad particular o políticas de colas.

Presumiblemente, al volver a cargar la guerra, se produce un cierre del Executor. Intenta poner las bibliotecas relevantes en la guerra, para que Tomcat's ClassLoader tenga una mejor oportunidad de recargar correctamente tu aplicación.

+1

Última parte de la respuesta es buena. –

Cuestiones relacionadas