如果与EJB Interceptor一起使用,则不会取消TimerService EJB

时间:2012-12-05 10:27:39

标签: java jboss ejb interceptor timertask

大家好我每个人都有定时器服务的问题,在超时时它会执行一些业务逻辑,如果业务逻辑中有任何异常。这是拦截器和计时器服务中的一个。那么计时器服务不会被取消。的 timer.cancel();

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

我的问题是如何在成功和失败(例外)的情况下停止计时器。请注意我也使用Interceptor(我无法删除,删除它时修复了问题)。

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

业务逻辑Bean

@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;
}
}

0 个答案:

没有答案