こんにちは、私はタイマーサービスに問題があります。タイムアウト時に、ビジネスロジックに例外がある場合は、ビジネスロジックを実行します。これは、インターセプターの1つとタイマーサービスでキャッチされます。その後、タイマーサービスはキャンセルされません。 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;
}
}