1

大家好,我对计时器服务有疑问,如果业务逻辑有任何异常,它会在超时时执行一些业务逻辑。它在拦截器之一和计时器服务中被捕获。那么定时器服务不会被取消。 计时器.取消();

那么它是如何工作的,我的计时器服务在超时时执行,它调用一个 ejb 函数,这个 ejb 有一个与之关联的拦截器。如果 ejb 函数有任何异常。拦截器基本上是在记录那个异常。然后我有一个停止计时器的代码,它应该在成功或失败的情况下工作,但它只会在成功的情况下停止计时器。如果发生故障(发生异常时),它不会取消计时器。所以每次我重新启动jboss时,它都会尝试再次执行计时器(因为它失败了)。

我的问题是如何在成功和失败的情况下停止计时器(异常)。请注意我也在使用拦截器(我无法删除它,而删除它可以解决问题)。

这是我的不同代码类,可能有助于理解问题。

业务逻辑豆

@Stateless
@Local(UtilityLocal.class)
@Interceptors({ ExceptionInterceptor.class })
public class UtilityEJB implements UtilityLocal {

public void doDomeThing(MazTimerTask task) {
    System.out.println("--- Business logic ---");
    Integer x = 5/0; // this will generate an exception
    System.out.println("--- Business logic ---");
}

}

拦截器

public class ExceptionInterceptor {
 @Resource 
 private javax.ejb.SessionContext ctx;
    @AroundInvoke
    public Object aroundInvoke(final InvocationContext invocationContext)
        throws Exception { //NOPMD

        try {
            return invocationContext.proceed();
        } 
        catch (Exception exception) {
           System.out.println(" Logg the exception here");
           throw exception;
        }
    }
}

定时器服务

@Stateless
public class MazTimer implements MazTimerLocal, MazTimerRemote{
 @EJB
 private transient UtilityLocal ejb;
@Resource
private transient TimerService timerService;
@Timeout
@TransactionTimeout(3600)
public void handleTimeout(Timer timer) {
    MazTimerTask task = (MazTimerTask) timer.getInfo();

    if (task != null ) {
        try{
            ejb.doDomeThing(task);
        }catch(Exception e) {
            System.out.println("------------ Exception occured : " + task.getName());

        }
        finally {
            stopTimer(task);
        }
    }

}

public void startTimer(MazTimerTask task) {
    timerService.createTimer(new Date(), 10, task);
}
private void stopTimer(MazTimerTask task) {
    try {
        Timer timer = getTimer(task);

        if (timer != null) {
            timer.cancel();
            System.out.println("------------ Timer stopped : " + task.getName());
        }

    } catch (RuntimeException e) {

    }
}
private Timer getTimer(Serializable timerId) {
    Timer timer = null;

    if (timerId != null) {
        Iterator<Timer> it = timerService.getTimers().iterator();

        while (it.hasNext()) {
            Timer currentTimer = it.next();

            if (currentTimer.getInfo().equals(timerId)) {
                timer = currentTimer;
                break;
            }
        }
    }

    return timer;
}
}
4

0 回答 0