什么可能是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)
方法。 提供四个预定义的处理程序策略
- 在默认的
ThreadPoolExecutor.AbortPolicy
,该处理程序在拒绝时引发运行时RejectedExecutionException
。- 在
ThreadPoolExecutor.CallerRunsPolicy
,调用执行本身的线程运行该任务。 这提供了一个简单的反馈控制机制,将减慢提交新任务的速度。- 在
ThreadPoolExecutor.DiscardPolicy
,无法执行的任务将被简单地删除。- 在
ThreadPoolExecutor.DiscardOldestPolicy
,如果执行程序没有closures,工作队列头部的任务将被删除,然后重试执行(可能会再次失败,导致重复执行)。可以定义和使用其他种类的
RejectedExecutionHandler
类。 要做到这一点需要特别小心,特别是在政策只能在特定能力或排队政策下工作的情况下。
因此大概重装战争会触发Executor
的closures。 尝试在战争中放置相关的库,以便Tomcat的ClassLoader
有更好的机会正确地重新加载您的应用程序。