AsyncRestTemplate没有调用DELETE端点

时间:2017-02-08 21:54:43

标签: spring http-delete asyncresttemplate

我需要在 fire中使用delete方法调用rest endpoint并忘记方式。我不在乎结果。 我试图使用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()方法不起作用。

1 个答案:

答案 0 :(得分:0)

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

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