2017-02-04 5 views
0

Я использую планировщик весны (@EnableScheduling) и имеют следующий @Scheduled метод, который вызывается каждую минуту:Trigger @Scheduled метод

@Component 
public class ScheduledTask { 

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

Теперь я хотел бы иметь возможность запускать планировщик перспективе, по требованию, из другого места в коде.

Я могу ввести ScheduledTask и просто вызвать метод run. Тем не менее, я хочу убедиться, что в данный момент существует только один поток, выполняющий метод run. Другими словами, если планировщик в настоящий момент запущен 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); 
    } 

Я не думаю, что весной есть что-то более простое. Это не имеет никакого смысла, поскольку это действительно флаг.

Edit:

Если вы хотите использовать его в нескольких местах применения, рассмотреть вопрос о внедрении собственной аннотации с семафором или атомными булевым вложенным.

+0

Этот код является неправильным, так как содержит условие гонки. Что произойдет, если два потока выполняют метод запуска точно в одно и то же время? Предположим, что thread1 выполняет строку с 'if', это правда, тогда thread2 выполняет ту же строку, это также верно. Поскольку у вас нет синхронизации, возможно, что более 1 потока будет запускать метод 'run'. Я использовал класс «Семафор», но в этом вопросе я спрашивал, есть ли какие-либо средства Spring, которые могут помочь здесь. –

+0

Хорошая точка, которую я изменил с помощью AtomicBoolean – Fernando

+0

Я думаю, что с AtomicBoolean вы должны быть в порядке. Там нет условий гонки. – Fernando