Я пытаюсь реализовать загрузочный планировщик Spring для тестирования интерфейсов Callable и ExecutorService.
В моем приложении у меня есть:
@Bean("fixedThreadPool")
public ExecutorService fixedThreadPool() {
return Executors.newFixedThreadPool(5);
}
Тогда:
**@Scheduled(fixedRate = 60000)**
public void removeUserIds(Set<String> userIds) {
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString("http://localhost:8080/remove");
final List<Callable<String>> callables = new ArrayList<>();
userIds.forEach(userId -> {
final List<Callable<String>> callables = new ArrayList<>();
userIds.forEach(userId -> {
final Callable<String> task = () -> {
try{
log.info("Calling service to remove user id node : "+userId);
callServiceToRemoveNode(url,userId);
} catch(ServiceException e ){
log.error("Error while calling service: "+e.getCause());
**executor.shutdownNow();**
}
return "";
}; //Call to remote service using RestTemplate
callables.add(task);
});
try {
final List<Future<String>> futureList =
executor.invokeAll(callables);
futureList.forEach(future -> {
try {
log.info(future.get());
} catch (final Exception e) {
log.error("Error : "+ e.getMessage());
}
});
} catch (final Exception e) {
log.error("Error Error Error : "+ e.getMessage());
} finally {
executor.shutdown();
}
}
Когда я вызываю метод removeUserIds () с 100 userIds, он работает нормально в счастливом потоке, но если служба недоступна или не работает, ошибка выводится в сотый раз, и во избежание этого я использовал executor.shutdownNow (); так что дальнейший вызов не будет обслуживать другие идентификаторы пользователей. Но планировщик не работает и не выполняется после интервала времени, если выполняется оператор executor.shutdownNow (); . Не могли бы вы помочь мне найти решение, чтобы избежать отключения планировщика, так что даже после executor.shutdownNow (); оператор выполняется в до запуска планировщика, он должен работать? или предложить здесь возможное решение?