У меня есть разные источники данных, из которых я хочу запрашивать параллельно (так как каждый из этих запросов является HTTP-вызовом и может занимать довольно много времени).Но я собираюсь использовать только 1 ответ на эти запросы.Так что я как бы расставил приоритеты.Если первый ответ недействителен, я проверю второй.Если он также недействителен, я хочу использовать третий и т. Д. Но я хочу прекратить обработку и вернуть результат, как только получу первый правильный ответ.
Чтобы смоделировать проблему, я создал следующий код, где я пытаюсь использовать параллельную потоковую передачу Java.Но проблема в том, что я получаю окончательные результаты только после обработки всех запросов.
public class ParallelExecution {
private static Supplier<Optional<Integer>> testMethod(String strInt) {
return () -> {
Optional<Integer> result = Optional.empty();
try {
result = Optional.of(Integer.valueOf(strInt));
System.out.printf("converted string %s to int %d\n",
strInt,
result.orElse(null));
} catch (NumberFormatException ex) {
System.out.printf("CANNOT CONVERT %s to int\n", strInt);
}
try {
int randomValue = result.orElse(10000);
TimeUnit.MILLISECONDS.sleep(randomValue);
System.out.printf("converted string %s to int %d in %d milliseconds\n",
strInt,
result.orElse(null), randomValue);
} catch (InterruptedException e) {
e.printStackTrace();
}
return result;
};
}
public static void main(String[] args) {
Instant start = Instant.now();
System.out.println("Starting program: " + start.toString());
List<Supplier<Optional<Integer>>> listOfFunctions = new ArrayList();
for (String arg: args) {
listOfFunctions.add(testMethod(arg));
}
Integer value = listOfFunctions.parallelStream()
.map(function -> function.get())
.filter(optValue -> optValue.isPresent()).map(val-> {
System.out.println("************** VAL: " + val);
return val;
}).findFirst().orElse(null).get();
Instant end = Instant.now();
Long diff = end.toEpochMilli() - start.toEpochMilli();
System.out.println("final value:" + value + ", worked during " + diff + "ms");
}
}
Поэтому, когда я выполняю программу, используя следующую команду:
$java ParallelExecution dfafj 34 1341 4656 dfad 245df 5767
Я хочу получить результат«34» как можно скорее (примерно через 34 миллисекунды), но на самом деле я жду более 10 секунд.
Не могли бы вы помочь найти наиболее эффективное решение этой проблемы?