我有一个JEE应用程序,它使用TimerService每3分钟运行一次。
每次运行计算可以持续最长1分30秒。为了限制它到最大时间我使用这样的Future API:
----------------------------------------------
// EJB TimerService
----------------------------------------------
private void computeThread() {
final Future<?> future = this.executor.submit(new Runnable() {
@Override
public void run() {
compute();
}
});
try {
future.get(this.maxDelay, TimeUnit.SECONDS);
} catch (@SuppressWarnings("unused") final InterruptedException e) {
LOGGER.error("Job Interrupted.");
} catch (final ExecutionException e) {
LOGGER.error("Execution Exception : " + e);
} catch (@SuppressWarnings("unused") final TimeoutException e) {
future.cancel(true);
LOGGER.warn("Compute interrupted by TimeOut.");
}
}
@Timeout
public void timerTimeout(final Timer timer) {
// simplified
computeThread();
}
----------------------------------------------
//EJB Computation (Singleton)
----------------------------------------------
@EJB
private transient DataWsEJB dataEJB;
@EJB
private transient EngineEJB engineEJB;
@EJB
private transient EJBA ejbA;
@EJB
private transient EJBB ejbB;
public void compute() {
// some computations and calls on EJBs
}
compute()函数调用另一个EJB(Singleton)中的计算。 这个Singleton有多个EJB(大部分时间都是无状态的)注入。
我的麻烦是,当InterruptedException从EJB中的任何地方(例如ejbA或ejbB)上升时,异常会被第一次捕获,但之后我会找到其他异常。 抓住它的好习惯是什么? 我应该在计算过程中可以调用的每个方法上添加抛出吗? (我发现这个太多了)或者我应该把它抓到一个级别,但我从Eclipse得到一些警告,所使用的方法不会抛出InterruptedException。
我在Java SE项目上找到了很多答案,但在JEE项目中没有找到答案。