Running two service calls in parallel is easy. Handling the case where one fails without leaving the other doing useless work is less so.
JEP 533 in
#Java27 re-previews Structured Concurrency with updated exception handling. With the default StructuredTaskScope, a failed subtask cancels the scope and interrupts unfinished work, while join() reports the failure as an ExecutionException. Seventh preview.