Good Practice在JEE中处理InterruptedException

时间:2018-02-13 15:38:37

标签: java java-ee ejb future interrupted-exception

我有一个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项目中没有找到答案。

0 个答案:

没有答案