Resttemplate 在 GET 请求后挂起。经过多次测试,我怀疑标题,尤其是内容长度

Sva*_*kas 5 performance spring resttemplate spring-boot postman

最新编辑

经过对许多不同服务的多次测试后,我怀疑挂起是标题的原因。也许是内容长度标题。但是我不知道为什么它会这样。我非常需要建议。我尝试使用返回较少标头的服务并且它不会挂起。

我有一个奇怪的问题。我正在使用 Resttemplate 通过 GET 请求连接到另一个服务。但是,在发送请求后,如果我使用自定义 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"
}
Run Code Online (Sandbox Code Playgroud)

我的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(){
    }


}
Run Code Online (Sandbox Code Playgroud)

用户类:

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;
     }

}
Run Code Online (Sandbox Code Playgroud)

获取方法:

@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());

    }

}
Run Code Online (Sandbox Code Playgroud)

欢迎任何想法。我真的很感激你的帮助。链接到我以前的问题也许它是链接的?如果不是因为速度慢,这个问题就解决了。错误“无法提取响应:找不到适合响应类型的 HttpMessageConverter ... 和内容类型 [application/json]”

编辑 我注意到它在浏览器中响应非常快。但是我正在使用 Postman 并且使用 Postman 速度非常慢。在这一点上我真的很迷茫,因为没有抛出任何错误或任何东西。

编辑 2 我从调试器中唯一能看到的是它在方法 afterExecute(task,throwed); 上挂了很长时间;在类 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);
    }
Run Code Online (Sandbox Code Playgroud)

但我不明白什么可能是错的,大约需要 30 秒......实际上需要一整分钟。如果您在响应实体和 restTemplate 中传递 String 而不是我的自定义 POJO,为什么响应会正常工作。

另一个编辑 我尝试使用 curl 获取响应,它获取标头获取响应,然后挂起一分钟。我不确定那时会发生什么。一分钟后,它退出并显示消息“curl: (18) transfer closed with 79 bytes to read”

已经尝试设置读取和连接超时没有帮助,尝试连接到不同类型的 POJO 响应的不同服务,它仍然相同。