0

我需要使用删除方法在火中调用休息端点并忘记时尚。我不在乎结果。我正在尝试使用 AsyncRestTemplate 但未调用服务器端。如果我切换到 RestTemplate 一切正常。然后我注意到当我等待回复时

AsyncRestTemplate template = new AsyncRestTemplate();
ListenableFuture<ResponseEntity<String>> exchange = template.exchange(
    url, 
    HttpMethod.DELETE, 
    new HttpEntity<Object>(headers), 
    String.class
);
exchange.get();

它也在工作。调用 PUT 端点没有任何问题(不必调用 get() 方法)。然后,我尝试使用超时,因为我不想等待响应并使用

    try {
        exchange.get(1, TimeUnit.MILLISECONDS);
    } catch (InterruptedException | ExecutionException | TimeoutException e) {
        //dirty hack
    }

在我的机器上,如果我设置 1 毫秒超时,那么端点被调用的可能性为 50%。在 50 毫秒时,它获得了 100% 的机会......

有什么想法有什么问题吗?

编辑:

我也试过

CompletableFuture.runAsync(() -> {
    try {
        exchange.get();
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
});

这已经奏效了。

AsyncRestTemplate template = new AsyncRestTemplate(
     new ConcurrentTaskExecutor(Executors.newCachedThreadPool())
);

不调用 get() 方法不起作用。

4

1 回答 1

0

如果您设置 1 ms 超时,则请求实际上很可能会超时,但客户端也会在处理超时时终止连接。

尝试在线程中调用它或创建一个ExecutorService并将请求排队。

于 2017-02-09T08:27:36.423 回答