1

我有一个关于 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 收到。

我说的对吗?还是我错了?

4

0 回答 0