Resttemplate зависает после запроса GET. После многих тестов я подозреваю заголовок и, возможно, конкретно длину содержимого - PullRequest
3 голосов
/ 19 апреля 2019

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ

После многих испытаний со многими различными службами я подозреваю, что причиной заголовков является зависание.Возможно заголовок длины контента.Однако я понятия не имею, почему он так себя ведет.Мне очень нужны предложения.Я пытался с сервисами, которые возвращают меньше заголовков, и он не зависает.

У меня странная проблема.Я подключаюсь к другому сервису с помощью запроса GET, используя Resttemplate.Однако после отправки запроса, если я использую пользовательский POJO в качестве ResponseEntity, потребуется около 30 секунд, чтобы увидеть ответ.Если я отправил его, используя String в качестве ResponseEntity, он отвечает быстро (до 1 с).Мне было интересно, что может быть причиной этого.Формат ответа:

{
    "data": [
        {
            "email": "eskaferas@gmail.com",
            "firstName": "Seras",
            "lastName": "Meras"
        },
        {
            "email": "Soras@gmail.com",
            "firstName": "Oras",
            "lastName": "Moras"
        },
        {
            "email": "bzbzb@gmail.com",
            "firstName": "hello",
            "lastName": "bye"
        },
        {
            "email": "lrc@gmail.com",
            "firstName": "Seras",
            "lastName": "Meras"
        }
    ],
    "message": "Success"
}

Мой POJO:

public class ArrayResponsePojo {
    private User[] data;
    private String message;

    public User[] getData() {
        return data;
    }
    public void setData(User[] data) {
        this.data = data;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }

    public ArrayResponsePojo(){
    }


}

Класс пользователя:

public class User {

     private String email;
     private String firstName;
     private String lastName;


     public User(){
     }

    public String getEmail() {
         return email;
     }
     public void setEmail(String email) {
         this.email = email;
     }
     public String getFirstName() {
         return firstName;
     }

     public void setFirstName(String firstName) {
        this.firstName = firstName;
     }
     public String getLastName() {
        return lastName;
     }
     public void setLastName(String lastName) {
         this.lastName = lastName;
     }

}

Метод get:

@GetMapping("/todos/{toDoNoteId}/users")
    public ResponseEntity getNotesUsersTest(@PathVariable int toDoNoteId) {
        ToDoNote note = toDoNoteService.getToDoNoteById(toDoNoteId);
        if(note==null) {
            throw new ToDoNoteNotFoundException("Note with id "+ toDoNoteId + " not found");

        }

    RestTemplate restTemplate = new RestTemplate();
    final String uri = "http://friend:5000/users";

    try {
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<String> entity = new HttpEntity<String>("parameters", requestHeaders);


        ResponseEntity<ArrayResponsePojo> result = restTemplate.exchange(uri, HttpMethod.GET,entity, ArrayResponsePojo.class);
        return result;

    }
    catch (HttpClientErrorException ex) {
        return ResponseEntity.status(ex.getRawStatusCode()).headers(ex.getResponseHeaders())
                .body(ex.getResponseBodyAsString());

    }

}

Любые идеи приветствуются.Буду очень признателен за помощь.Ссылка на мою предыдущую проблему, возможно, она связана?Эта проблема решена, если бы не медленная скорость. Ошибка "Не удалось извлечь ответ: не найден подходящий HttpMessageConverter для типа ответа ... и типа содержимого [application / json]"

EDIT Я заметил, что этоочень быстро отвечает в браузере.Но я использую Почтальон и использую Почтальон, это очень медленно.Я действительно потерян в этот момент, так как не выдается никаких ошибок или чего-либо еще.

EDIT 2 Единственное, что я могу видеть из отладчика, это то, что он долго зависает на методеafterExecute (задача, брошенная);в классе java.util.concurrent.ThreadPoolExecutor.Это действительно расстраивает: (

РЕДАКТИРОВАТЬ 3 Я думаю, что это как-то связано с потоками, но запуск отладки во второй раз, когда он завис на другом методе в классе java.util.concurrent.LockSupportназывается

public static void park(Object blocker) {
        Thread t = Thread.currentThread();
        setBlocker(t, blocker);
        UNSAFE.park(false, 0L);
        setBlocker(t, null);
    }

Но я не понимаю, что может быть не так, это займет около 30 секунд ... На самом деле это занимает целую минуту. И почему ответ работает нормально, если вы передаете String вместо моегопользовательский POJO в объекте ответа и restTemplate.

Еще один РЕДАКТИРОВАТЬ Я попытался получить ответ с помощью curl, и он получает заголовки, получает ответ, а затем просто зависает на минуту. Я неуверен, что может произойти в этот момент. Через минуту он выходит с сообщением «curl: (18) передача закрыта с 79 байтами, остающимися для чтения»

Уже пробовал установить тайм-ауты чтения и соединения не помогло, попытался соединитьсядля разных сервисов, которые отвечают разными типами POJO, он остается тем же.

...