What could be the cause of RejectedExecutionException
java, multithreading
Solution
From ThreadPoolExecutor JavaDoc (emphasis mine)
New tasks submitted in method `execute(java.lang.Runnable)` will be rejected when the `Executor` has been shut down, and also when the `Executor` uses finite bounds for both maximum threads and work queue capacity, and is saturated. In either case, the execute method invokes the `RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)` method of its `RejectedExecutionHandler`. Four predefined handler policies are provided:
- In the default `ThreadPoolExecutor.AbortPolicy`, the handler throws a runtime `RejectedExecutionException` upon rejection.
- In `ThreadPoolExecutor.CallerRunsPolicy`, the thread that invokes execute itself runs the task. This provides a simple feedback control mechanism that will slow down the rate that new tasks are submitted.
- In `ThreadPoolExecutor.DiscardPolicy`, a task that cannot be executed is simply dropped.
- In `ThreadPoolExecutor.DiscardOldestPolicy`, if the executor is not shut down, the task at the head of the work queue is dropped, and then execution is retried (which can fail again, causing this to be repeated.)
It is possible to define and use other kinds of `RejectedExecutionHandler` classes. Doing so requires some care especially when policies are designed to work only under particular capacity or queuing policies.
Presumably therefore, reloading the war triggers a shutdown of the `Executor`. Try putting the relevant libraries in the war, so that Tomcat's `ClassLoader` has a better chance of correctly reloading your app.
Problem
I am getting this exception on my tomcat server (+liferay) ``` java.util.concurrent.RejectedExecutionException ``` my class is like that : ``` 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); } } ``` I get this exception on the line `super.execute(command);` This error can occur when the queue is full but the `LinkedBlockingQueue` size is 2^31, and I am sure that there is no so many command waiting. At start everything is stable, but after I redeploy a war it starts occuring. This class is not part of the war but in a jar in tomcat/lib. Do you have any idea why this happend and how to fix it ?