2017-02-04 3 views
0

私は春のスケジューラ(@EnableScheduling)を使用し、毎分と呼ばれ、次の@Scheduled方法があります。トリガー@Scheduled方法

@Component 
public class ScheduledTask { 

    @Scheduled(fixedRate = 60*1000) 
    public void run() { 
    // ... 

今はオンデマンドで、スケジューラの実行をトリガーできるようにしたいと思いますが、コード内の別の場所から

ScheduledTaskを注入してrunメソッドを呼び出すことができます。しかし、ある時点でrunメソッドを実行しているスレッドが1つだけであることを確認したいと思います。言い換えれば、スケジューラが現在runを実行している場合、私はその呼び出しを無視したいと思っています。

また、runを非同期に呼び出すこともできますが、@EnableAsync@Asyncを使用すると簡単に対処できます。

このシナリオで使用できるSpring機能はありますか?

答えて

0

コメントの編集:

AtomicBooleanを使用してください。

@Component 
public class ScheduledTask { 

private AtomicBoolean isRunning = new AtomicBoolean(false); 

@Scheduled(fixedRate = 60*1000) 
public void run() { 
    if (isRunning.compareAndSet(false, true)) { 

     // ... do your things 

     //whenever you are done 
     isRunning.set(false); 
    } 

私は春にはもっと簡単なことはないと思います。それは本当に旗のことなので意味がありません。

編集:あなたはアプリケーションのいくつかの場所でそれを使用したい場合は

、埋め込まれたセマフォまたは原子ブールを使用して独自の注釈を実装することを検討。

+0

このコードには競合状態が含まれているため、間違っています。 2つのスレッドがまったく同時にrunメソッドを実行するとどうなりますか?例えば、thread1が 'if'で行を実行したとすると、それは真であり、thread2は同じ行を実行するとします。同期がないので、2つ以上のスレッドが 'run'メソッドを実行する可能性があります。私は 'Semaphore'クラスを使いましたが、この質問で私はここで助けてくれるSpringの施設があるかどうかを尋ねていました。 –

+0

良い点AtomicBooleanを使って変更しました – Fernando

+0

私はAtomicBooleanでうまくいくと思います。そこに競争条件はありません。 – Fernando

関連する問題