タイマー サービスを管理するステートレス Bean があります。
@Stateless
@Depends("jboss.ha:service=HASingletonDeployer,type=Barrier")
public class TimerManagerBean implements ITimerManagerLocal {
private static final Logger log = Logger.getLogger(TimerManagerBean.class);
private @Resource
SessionContext ctx;
private @EJB ISomeEjbLocal someEjb;
public void scheduleTimer(long initialDuration, long intervalDuration, Serializable info) {
if (info.equals(ITimerManagerLocal.TIMER_ID_1)) {
ctx.getTimerService().createTimer(initialDuration, intervalDuration, info);
}
}
@Override
public void cancelTimer(Serializable info) {
final Collection<Timer> timers = ctx.getTimerService().getTimers();
for (final Timer timer : timers) {
if (timer.getInfo().equals(info)) {
log.info("Timer[info=" + info + "] found, cancelling...");
timer.cancel();
log.info("Timer[info=" + info + "] cancelled");
}
}
}
@Override
@Timeout
public void timeoutHandler(Timer timer) throws Exception {
Serializable info = timer.getInfo();
if (ITimerManagerLocal.TIMER_ID_1.equals(info)) {
someEjb.doSomething(); // what happen if this throw exception?
}
}
}
}
これが私のローカルインターフェースです:
@Local
public interface ITimerManagerLocal {
public static final String TIMER_ID_1 = "TIMER_ID_1";
public void scheduleTimer(long initialDuration, long intervalDuration, Serializable info);
public void cancelTimer(Serializable info);
public void timeoutHandler(Timer timer) throws Exception;
}
タイマーを作成/キャンセル/スケジュールするために使用します。このサービスは以前は正常に機能していましたが、現在は null タイマー オブジェクトを timeoutHandler メソッドに渡すようになり、NullPointerException がスローされます。これは、timeoutHandler メソッドの呼び出しごとに発生します。hsdbではなく、postgresを使用してタイマー情報を保存しています。これはpostgres 9に移行した後に発生し始めたと思いますが、理由がわかりません。間違っている可能性があります。また、timer.getInfo() が NullPointerException をスローすると (timer が null であるため)、timeoutHandler メソッドで何が起こるか。この例外はどこにスローされますか? タイマーの正しい再スケジュールを妨げる可能性はありますか?
ありがとう。