我有一个关于 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 收到。
我说的对吗?还是我错了?