大家好,我对计时器服务有疑问,如果业务逻辑有任何异常,它会在超时时执行一些业务逻辑。它在拦截器之一和计时器服务中被捕获。那么定时器服务不会被取消。 计时器.取消();
那么它是如何工作的,我的计时器服务在超时时执行,它调用一个 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;
}
}