可能是RejectedExecutionException的原因
我在雄猫服务器(+ 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);
当队列已满但LinkedBlockingQueue
大小为2 ^
31时,可能会发生此错误,并且我确定没有那么多命令在等待。
一开始一切都稳定,但在我重新部署战争后,一切开始发生。此类不是战争的一部分,而是放在tomcat / lib中的jar中。
您是否知道为什么会发生这种情况以及如何解决?
回答:
从ThreadPoolExecutor
JavaDoc(重点是我的)
在方法提交的新任务
execute(java.lang.Runnable)
将被拒绝时,也
Executor
使用有限的边界两个最大线程和工作队列容量,且饱和。无论哪种情况,execute方法都将调用其RejectedExecutionHandler.rejectedExecution(java.lang.Runnable,
java.util.concurrent.ThreadPoolExecutor)方法
RejectedExecutionHandler
。提供了四个预定义的处理程序策略:1.
默认情况下
ThreadPoolExecutor.AbortPolicy
,处理程序RejectedExecutionException
在拒绝时抛出运行时。2.
在中
ThreadPoolExecutor.CallerRunsPolicy
,调用执行自己的线程运行任务。这提供了一种简单的反馈控制机制,它将降低新任务的提交速度。3. 在中
ThreadPoolExecutor.DiscardPolicy
,简单地删除了无法执行的任务。4.
在中
ThreadPoolExecutor.DiscardOldestPolicy
,如果未关闭执行程序,则将丢弃工作队列开头的任务,然后重试执行(这可能再次失败,从而导致重复执行此操作)。可以定义和使用其他种类的
RejectedExecutionHandler
类。这样做需要格外小心,尤其是在设计策略仅在特定容量或排队策略下才能工作时。
因此,大概是重新加载战争会触发的关闭Executor
。尝试将相关的库放入战场,以便Tomcat
ClassLoader
更有机会正确地重新加载您的应用程序。
以上是 可能是RejectedExecutionException的原因 的全部内容, 来源链接: utcz.com/qa/425620.html