RestTemplate.postForObject () java.net.SocketTimeoutException: время чтения истекло, ДАЖЕ ЧЕРЕЗ УСПЕШНОЕ - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть два приложения веб-службы Java Spring Boot на одном сервере, вызывающие друг друга через REST.Служба A вызывает Службу B, и последняя успешно действует после уведомления.ПРОБЛЕМА заключается в том, что Сервис A никогда не получает подтверждение от Сервиса B, поэтому он считает, что произошел сбой, и в соответствии со своей логикой восстановления цикла он пытается снова… и снова… и снова.Служба B в конечном итоге выполняет работу в 3 раза больше без дополнительной выгоды.

Соответствующий код (урезанный и фальсифицированный для защиты виновных) выглядит следующим образом:

Сервис A:

public void giveOrderToServiceB(@RequestBody CustomClass message) {
...    
org.springframework.web.client.RestTemplate template = new RestTemplate(clientHttpRequestFactory());
com.mycompany.CustomReply reply = template.postForObject(serviceBUrl, message, CustomReply.class);

Сервис B Контроллер REST:

@PostMapping(value="ExecuteTheWork", produces=org.springframework.http.MediaType.APPLICATION_JSON_VALUE, consumes=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody CustomReply executeTheWork(@RequestBody CustomClass thing) {
    // do something with the thing...
   CustomReply reply = new CustomReply();
    reply.setReply("Successfully executed the work.");
    return reply;
}

Фактическое исключение, обнаруженное службой A после вызова RestTemplate.postForObject (), равно

java.net.SocketTimeoutException: Read timed out

Пожалуйста, сообщите.

1 Ответ

0 голосов
/ 21 ноября 2018

ОК, думаю, я понял.Я не отправляю ответ обратно из Сервиса B до тех пор, пока метод не завершит всю свою работу, что может занять от нескольких секунд до нескольких минут.Если я сразу отвечаю (и пропускаю обработку), это работает последовательно.Нужно раскрутить реальную работу в отдельную ветку.Cheeers

...