2016-08-10 8 views
0

私は30秒ごとに1回起動するステートレスEJBバージョン3.0を実行しています。私の問題は、私がそれを実行した後、私が何をしても、約2秒ごとに消える4つのアクティブタイマー(WebLogicコンソールで確認済み)で常に実行されるということです。ステートレスEJBタイマのアクティブタイマーカウントが高すぎる

悲しいことに、私は私のコードを持つスーパー具体的に、しかし、ここで私が持っているものであることはできません。

  • Aは、私は私のプログラムの冒頭で呼んでいるタイマーメソッドを作成します。ここにはtimerService.createTimer呼び出しがあります。タイマがまだ呼び出されずに作成されているため、これは実際には何もしません。どうして?
  • @postConstructメソッドは、テスト用に何かを印刷しているだけです。それは必要なように呼び出されています。
  • 複数のタイマーのために必要以上にWAYと呼ばれる@Timeoutメソッド。これが私のビジネスロジックです。私のweblogic-ejb-jar.xmlで
  • は、私は、max-beans-in-free-poolには1

任意の提案をいただければ幸いに設定されています。私は何が起こっているのか完全に理解していないと思うが、私はこれに役立つものは何も見つけることができない。

+0

この部分の詳細は次のとおりです。「プログラムの冒頭で呼び出しているタイマーメソッドを作成する。ここにtimerService.createTimer呼び出しがあります。」 コード内の名前を変更しても問題ありません。 – davidxxx

+0

メソッド名のように名前を変更しますか? – Dan

答えて

1

EJB 3.0では、すべてのタイマーは永続的です。言い換えれば、サーバーの再起動後も存続します。

インターバルタイマーを作成すると、インターバルタイマーをキャンセルするまで実行されます。サーバーを停止しても、サーバーはキャンセルされません。多くの実装は、サーバの再起動時に再試行することが知られています。

あなたの既存のコードは、再起動時にもう1つのタイマーを作成しています。

@Resource 
private TimerService timerService; 

@PostConstruct 
void startup() { 
    ... 
    for (Timer timer: timerService.getTimers()) { 
     timer.cancel(); 
    } 
    ... 
} 

これがあなたのために物事をクリーンアップする必要があります

は、タイマーをサービスEJBで@PostConstructメソッドに以下を追加することを検討してください。

+0

うん、それだった。ありがとう! – Dan

関連する問題