Jersey Client 2.29で非同期呼び出し時のタイムアウトが効かない

2019年8月21日



使い方が悪いのかもしれないのだが、サーバがシャットダウン状態(接続先の無い状態)でJersey Client 2.29で非同期呼び出しを行うと永遠に待機してしまう。元は複雑なコードなので概要になるが、おおよそは以下のようなものだ。

    Client client = ClientBuilder.newClient(new ClientConfig(
      new JacksonJaxbJsonProvider()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    ));
    WebTarget target = client.target("http://localhost:8080/api");
    Invocation.Builder builder = target.request(); 
    Future<Response>future = builder.get();

このfutureを別スレッドで待機すると、サーバに接続できない場合は永遠に待ってしまう。応答がこないのだ。しかし、Futureを無視して以下のようにするとうまく行く。きちんとコールバックされている。

  builder.get(new InvocationCallback() {
    ....
  });

https://allegro.tech/2014/10/async-rest.htmlには、この処理にバグがあるようなことが書いてあるのだが、未だに治っていないのだろうか?