Как планировать задачи с задержкой - PullRequest
0 голосов
/ 11 февраля 2019

Мне нужно запланировать запуск задачи через 2 минуты.Затем, когда время истекло, мне нужно проверить, все ли мы ONLINE.Если мы все еще онлайн, я ничего не делаю.Если OFFLINE, то я сделаю некоторую работу.

private synchronized void schedule(ConnectionObj connectionObj)
{
    if(connectionObj.getState() == ONLINE)
    {
        // schedule timer
    }
    else
    {
       // cancel task.
    }
}

Это код, который я рассматриваю:

@Async
private synchronized void task(ConnectionObj connectionObj)
{
    try
    {
        Thread.sleep(2000); // short time for test
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }

    if(connectionObj.getState() == ONLINE)
    {
       // don't do anything
    }

    else
    {
       doWork();
    }
}

Для планирования этой задачи я должен использовать @Async?Я все еще могу получить гораздо больше звонков по расписанию, пока я жду в методе task().

Есть ли у SpringBoot что-то вроде потока, который я создаю каждый раз, когда вызывается schedule(), чтобы это стало легко?

Я ищу что-то похожее на postDelay() из Android: как правильно использовать postDelayed () в Android Studio?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Обновление

Учитывая, как вам нужно планировать их "по требованию", @Scheduling не поможет, как вы упомянули.Я думаю, что самое простое решение - пойти на что-то вроде предложенного @Leftist.

В противном случае, как я уже упоминал в комментариях, вы можете посмотреть на интеграцию Spring Boot Quartz, чтобы создать задание и запланировать его с помощью Quartz.Затем он позаботится о его запуске после двухминутной отметки.Это просто больше кода для почти того же результата.

Оригинал

Для Spring Boot, вы можете использовать встроенную Поддержка планирования .Он позаботится о своевременном запуске вашего кода в отдельном потоке.

Как указано в статье, вы должны включить планирование с помощью @EnableScheduling.

Затем вы комментируете свой метод, который вы хотите запустить с @Scheduled(..), и вы можете либо установить выражение fixedDelay или cron, либо любой из других параметров синхронизации в соответствии с вашими требованиями к времени выполнения.

0 голосов
/ 11 февраля 2019

Я не уверен насчет исключительно spring-boot решения, так как это не то, с чем я работаю.

Однако вы можете использовать ScheduledExecutorService , который находится в базовой среде Java.Для вашего использования это будет выглядеть примерно так:

@Async
private synchronized void task(ConnectionObj connectionObj)
{
    Executors.newScheduledThreadPool(1).schedule(() -> {
        if(connectionObj.getState() == ONLINE) 
        {
            // don't do anything
        } 

        else 
        {
           doWork();
        }
    }, 2, TimeUnit.MINUTES);
}

Я использовал лямбда-выражения, которые объясняются здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...