Как вызвать универсальную функцию внутри другой функции с тайм-аутом с Java 8? - PullRequest
1 голос
/ 18 марта 2019

У меня есть функция, которая дает мне состояние обслуживания:

public ServiceState getServiceState(){
      return someService().getState(); //currently state return "NOTACTIVE"
} 

И когда я вызываю определенный метод в системе, служба должна быть в активном состоянии через x промежуток времени (неизвестное время):

someService().startService(); //after a while, the state of the service should be active

Если бы я хотел проверить состояние сервиса только один раз, я бы сделал это:

public boolean checkCurrentState(String modeToCheck){
      return getServiceState() == modeToCheck; 
}

checkCurrentState("ACTIVE"); //return true or false depends on the state

Проблема в том, что для изменения состояния требуется некоторое время, поэтому мне нужно следующее:

Мне нужно проверить текущее состояние (в цикле while на x определенное мной количество секунд), если через x секунд служба все еще находится в режиме "NOTACTIVE", я сгенерирую какое-то исключение, чтобы прекратить свою программу .

Итак, я подумал о следующем решении: Метод с двумя переменными: переменная, представляющая обобщенную функцию, которая может быть вызвана внутри метода, и переменная, время, которое я позволяю ему продолжать проверять: (псевдокод)

public void runGenericForXSeconds(Func function,int seconds) throws SOMEEXCEPTION{
      int timeout = currentTime + seconds; //milliseconds
      while (currentTime < timeout){
           if (function.invoke()) return; //if true exits the method, for the rest of the program, we are all good
      }
      throw new SOMEEXCEPTION("something failed"); //the function failed
}

Что-то в этом роде, но мне нужно, чтобы это было как можно более универсально (часть вызываемого метода должна принимать другие методы), лямбда-коды Java 8 являются частью решения?

1 Ответ

3 голосов
/ 18 марта 2019

В частности, используя ваш пример:

public void runGenericForXSeconds(BooleanSupplier supplier, int seconds) throws SOMEEXCEPTION {
    int timeout = currentTime + seconds; // milliseconds
    while (currentTime < timeout) {
        if (supplier.getAsBoolean())
            return; // if true exits the method, for the rest of the program, we are all good
    }
    throw new SOMEEXCEPTION("something failed"); // the function failed
}

Тогда вашему поставщику просто нужно вернуть true или false.Например:

runGenericForXSeconds(() -> !checkCurrentState("ACTIVE"), 100);

Обратите внимание, что у вас занятый цикл.Если вы явно не хотите этого, вы можете сделать паузу между вызовами, используя Thread.sleep() или аналогичный.

...