JSR-000318仕様は、TimerServiceを定義しています(第18章)。
EJBを指定すると、自動タイマーまたはプログラムタイマーを作成できます。
自動タイマーは、次のようになります
@Schedules(
{
@Schedule(hour=”12”, dayOfWeek=”Mon-Thu”),
@Schedule(hour=”11”, dayOfWeek=”Fri”)
})
public void sendLunchNotification() { ... }
一方で、プログラムタイマーは、次のようになります
@Resource
private TimerService timerService;
void someMethod(){
ScheduleExpression exp = new ScheduleExpression();
(... set exp ...)
TimerConfig config = new TimerConfig();
(... set config ...)
Timer created = timerService.createCalendarTimer(exp,config);
}
場合は、プログラムタイマーが作成され、タイマーによってトリガーされるタスクは@Timeoutで注釈を付けているものです
私の質問ですが、JSRに明確に記載されていることが見つからなかったため、同じScheduleExpressionを使用して同じEJBに対して2つのプログラムタイマーを作成する場合、コンテナーは@Timeoutメソッドを2回または1回呼び出す必要がありますか?
私の質問をより明確にするため。
2つのプログラムタイマーを作成したとしましょう。それぞれに異なるメタデータがあります(シリアル化可能なタイマーINFO属性に格納されます)。次に、2つの異なるタイマーが必要です。@ Timeoutメソッドが実行されると、このINFO属性を取得して何をするかを選択します。
私の質問の答えが2回の場合、私ができるよりも。私の質問の答えが一度なら、私はできません。
答えが1回の場合、複数のトリガーがある場合でも、特定の瞬間にEJBに複数回通知する必要はないため、パフォーマンスの観点からは理にかなっていることに注意してください。これらのトリガーを個別に処理することを計画している場合(それぞれが異なるINFOを持っているため)、誰かがタイマーを作成する試みを無視しているだけです。
タイマーは別個のものであるため、2つ作成すると、スケジューリング情報が同じであるかどうかに関係なく、両方のタイマーに対して@Timeoutメソッドが呼び出されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加