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 ミリ秒のタイムアウトを設定すると、リクエストが実際にタイムアウトになる可能性が非常に高くなりますが、タイムアウトの処理中にクライアントも接続を終了します。

スレッドで呼び出してみるか、 を作成ExecutorServiceしてリクエストをキューに入れます。

于 2017-02-09T08:27:36.423 に答える