大家好我每个人都有定时器服务的问题,在超时时它会执行一些业务逻辑,如果业务逻辑中有任何异常。这是拦截器和计时器服务中的一个。那么计时器服务不会被取消。的 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;
}
}