Я пытаюсь использовать ExecutorService Java для отправки параллельных запросов REST, которые делают различные журналы системной информации (поступающие с контроллера), однако запутываются в ошибку. Около половины моих запросов успешно добираются до цели, но другая половина выглядит так, как будто они отправлены, но не найдены на сервере, на который они были отправлены. Я думаю, что у меня может быть недостаток в логике создания моей Исполнительной службы. Функция log(), показанная ниже, может быть вызвана из вызова REST контроллеру и предположительно для создания нового потока, который отправляет отдельный HTTP-запрос и продолжит основной поток, чтобы не дожидаться сети I/O. После долгих поисков, я считаю, что я отключил ExecutorService, ожидая завершения потока. Может ли кто-нибудь увидеть некоторую ошибку в логике создания моего потока, поскольку могут появляться многочисленные запросы от контроллера?Ошибка вызова Java ExecutorService REST
//Controller
//code
@RequestMapping(value="/log", method= RequestMethod.GET)
public String log()
{
genomicsLogger.log(Severity.err, Category.LOG, "This is a log from the reporting manager!");
return "Hopefully logged";
}
//ClassB
public String log(String trns , String user, Severity severity, Category category, String msg) {
trnsField = trns;
userField = user;
...
...
...
ExecutorService executor = Executors.newFixedThreadPool(1);
Runnable task =() -> {
try {
System.out.println("Started thread: " + Thread.currentThread().getName());
restService.consumeRest(true, instance.getUri().toString(), LOG_URI, list, log, HttpMethod.POST, new HttpHeaders(), String.class);
System.out.println("SENT REST REQUEST");
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
};
executor.submit(task);
try {
System.out.println("attempt to shutdown executor");
executor.shutdown();
executor.awaitTermination(5, TimeUnit.SECONDS);
}
catch (InterruptedException e) {
System.err.println("tasks interrupted");
}
finally {
if (!executor.isTerminated()) {
System.err.println("cancel non-finished tasks");
}
executor.shutdownNow();
System.out.println("shutdown finished");
}
return "";
}
Непонятно, почему вы хотите создать ExecutorService для одного потока при каждом вызове 'log()'. Общая схема заключается в создании (глобального) ExecutorService с рациональным размером ('Executors.newFixedThreadPool (100)') и выключения при выходе из программы. – PeterMmm