Это скорее проблема дизайна, чем проблема кодирования. Там может быть несколько подходов. Вы можете взять этот пример, например:
Использовать глобальный флаг
Ищите глобальный логический флаг, скажем Globals.serviceUnavailable
, прежде чем фактически запускать вызов удаленной службы. Этот глобальный флаг может быть установлен первыми службами, которые столкнулись с удаленной ошибкой. Вот изменения в коде.
final Callable<String> task = () -> {
try{
if( !Globals.serviceUnavailable ) callServiceToRemove(builder,userId);
}
catch( ServiceUnavailableException e ){ //Or whatever your exception is
Globals.serviceUnavailable = true; //Notify the remaining tasks that the service is unavailable.
}
}
Конечно, вы должны увидеть если обновление значения Globals.serviceUnavailable
должно быть синхронизировано. (Это может не потребоваться, если вы в порядке для частичного успешного удаления пакета пользовательских идентификаторов.)
Кроме того, это будет работать, только если ваш пул потоков намного меньше, чем количество отправленных задач, что я вижу, дело здесь.