1

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

0 に答える 0