什么可能是RejectedExecutionException的原因

我得到这个exception在我的tomcat服务器(+ liferay)

java.util.concurrent.RejectedExecutionException 

我的课是这样的:

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

我在super.execute(command);行上得到这个exceptionsuper.execute(command); 当队列已满但LinkedBlockingQueue大小为2 ^ 31时,会发生此错误,并且我确信没有太多的命令在等待。

一开始一切都很稳定,但是我重新部署了一场战争之后就开始发生了。 这个类不是战争的一部分,而是在tomcat / lib的jar中。

你有什么想法为什么发生这种情况,以及如何解决它?

从ThreadPoolExecutor JavaDoc

execute(java.lang.Runnable)方法execute(java.lang.Runnable)提交的新任务将在execute(java.lang.Runnable)closures时被拒绝,并且Executor程序对最大线程和工作队列的容量使用有限边界且饱和。 无论哪种情况,execute方法都会调用RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)方法。 提供四个预定义的处理程序策略

  1. 在默认的ThreadPoolExecutor.AbortPolicy ,该处理程序在拒绝时引发运行时RejectedExecutionException
  2. ThreadPoolExecutor.CallerRunsPolicy ,调用执行本身的线程运行该任务。 这提供了一个简单的反馈控制机制,将减慢提交新任务的速度。
  3. ThreadPoolExecutor.DiscardPolicy ,无法执行的任务将被简单地删除。
  4. ThreadPoolExecutor.DiscardOldestPolicy ,如果执行程序没有closures,工作队列头部的任务将被删除,然后重试执行(可能会再次失败,导致重复执行)。

可以定义和使用其他种类的RejectedExecutionHandler类。 要做到这一点需要特别小心,特别是在政策只能在特定能力或排队政策下工作的情况下。

因此大概重装战争会触发Executor的closures。 尝试在战争中放置相关的库,以便Tomcat的ClassLoader有更好的机会正确地重新加载您的应用程序。