可能是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

回到顶部