Есть ли способ запланировать функцию с параметрами в весенней загрузке - PullRequest
0 голосов
/ 23 марта 2020

Я хочу, чтобы функция принимала имя базы данных / схемы в качестве входных данных и проверяла, активна ли база данных или нет каждые 5 минут, а затем регистрирует ее в другой таблице. Вроде как мониторинг базы данных

У меня есть функция скажи повторить

function repeat(String database_name) {
     //check database_name can be connected or not
}

Как передать значение внутри функции repeat (если не параметр), когда я буду пометить его с помощью @ schedule

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Одним из решений этой проблемы было бы создание объекта, представляющего параметры, и при этом выполнении через 5 минут получить этот объект и использовать внутреннее состояние в качестве представления параметров. Вы должны убедиться, что MyEventService содержит ссылку на событие перед выполнением каждые 5 минут. Без дополнительного вклада в исходное сообщение невозможно узнать, как / когда вы это делаете.

Если параметры никогда не меняются, я предлагаю сделать службу неизменной, удалить класс событий и просто предоставить значения через свойства, используя @Value.

class Event {

    private final String myString;

    // constructor, getter

}
@Service
public class MyEventService {

    private Event event;

    // constructor, setter, getter

}
class MyScheduledTask {

    @Autowired
    private MyEventService eventService;

    @Scheduled(fixedDelay = 300_000)
    public void execute() {
        Event event = eventService.getEvent();

        if (event == null) {
            throw new IllegalStateException("No event to process.");
        }
        // process event
    }
}
0 голосов
/ 23 марта 2020

На самом деле @Scheduled принимает параметры. Используйте параметр fixedRate для указания интервала в миллисекундах:

@Scheduled(fixedRate = 300000‬)
public void youFunction() {
}

будет выполнять его каждые 5 минут.

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

Вы можете использовать TaskScheduler и вручную планировать задачи с помощью

taskScheduler.schedule(task1, new PeriodicTrigger(5, TimeUnit.MINUTES));

, где 5 также может быть параметром.

...