@PostConstructを使用して、ステートレスBean EJB3でタイマーを作成する方法は?
-
28-09-2019 - |
質問
プールで無国籍の豆が作成されたら、タイマーEJB3を作成したいと思います。しかし、私が使用する場合 @PostConstruct
例外が得られます:
java.lang.IllegalStateException: [EJB:010193]Illegal call to EJBContext method. The bean is in "null" state. It cannot perform 'getting the Timer Service' action(s). Refer to the EJB specification for more details.
コンテナが@PostConstructを呼び出す場合、Beanはnullでありません。それで、なぜ私はこの例外を得るのですか?
クラス
@Stateless
public class TestBean implements TestLocal {
@Resource
TimerService timerService;
@PostConstruct
public void startTimer() {
if (timerService.getTimers().size() == 0) {
timerService.createTimer(1 * 1000, 1 * 1000, null);
}
}
@Override
public void test() {
}
}
インターフェース
@Local
public interface TesteLocal {
void test();
}
サーブレット
public class TestServlet extends HttpServlet {
@EJB
private TestLocal test;
protected void doGet(....) throws .... {
test.test();
}
}
詳細
WebLogic Server 11gを使用しています。
解決
私は100%確信がありませんが、Beanクラスは実装しなければならないと思います javax.ejb.TimedObject
または、注釈を付けた方法を持っています @Timeout
EJBタイマーを使用します。例:
@Stateless
public class TestBean implements TestLocal {
@Resource
TimerService timerService;
@PostConstruct
public void startTimer() {
if (timerService.getTimers().size() == 0) {
timerService.createTimer(1 * 1000, 1 * 1000, null);
}
}
@Timeout
@TransactionAttribute(value=REQUIRES_NEW)
public void timeoutCallback(Timer timer) {
...
}
}
Weblogicはまだ上記のコードに不平を言っていますか?
PS:いずれにせよ、現在のエラーは非常に不十分に報告されています。おそらくケースを開く必要があります。
他のヒント
@PostConstructを使用して、Stateless Bean EJBでタイマーを作成することはできません。このブログを参照してください Weblogic 10クラスター環境でEJB3タイマーの使用方法 説明のために。ブログでさえWeblogicについて話していましたが、説明は他のアプリサーバーにも適用されるはずです。
コンテナは、ステートレスセッションBeanの@PostConstructで注釈された方法のタイマーサービスを許可しません。 @PostConstructで注釈が付けられた方法でTimerServiceを使用する場合は、Singleton Session Bean(@singleton)のGOを使用します。