我对EJBTimerService有疑问。
EJBTimerService是中央控制器,它使用java.util.Timer。
java.util.Timer jdkTimer = ejbContainerUtil.getTimer();
jdkTimer.schedule(timerTask, timerExpiration);
我的问题是java.util.Timer.mainLoop停止工作,并且未安排新任务。
在对GlassFish源代码进行分析之后,我得出了结论。 发生问题是因为当EJBTimeout时,我们从ejbContainerUtil.addWork(work)接收到RejectedExecutionException。
EJBTimerTask timerTask = new EJBTimerTask(timerExpiration, timerId, this);
timerService_.taskExpired(timerId_);
在ejbContainerUtil.addWork内部,我们具有defaultThreadPoolExecutor.submit()
defaultThreadPoolExecutor = EjbThreadPoolExecutor extends ThreadPoolExecutor + AbortPolicy.
TaskExpiredWork work = new TaskExpiredWork(this, timerId);
ejbContainerUtil.addWork(work);
因此,计时器java.util.Timer.mainLoop停止工作, 因为超出了核心轮询,队列已满,超过了最大核心,所以我们从ThreadPoolExecutor收到RejectedExecutionException。
我是Corret吗?还是我错了?