Apache CXF API を使用して非同期 JAX-RS Web メソッドを開発しました。webmethod は、次のようにカスタム タイプをパラメーターとして受け取ります。
@POST
@Path("/query")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(value={MediaType.APPLICATION_JSON , "application/CustomType"})
public void getQueryResults(@Suspended final AsyncResponse asyncResponse, CustomType conf)
「CustomType」のシリアル化を処理するために、カスタム MessageBodyReader と MessageBodyWriter を実装しました (サービス側とクライアント側)。クライアント側では、実装されたものを
Client client = ClientBuilder.newClient().register(CacheConfigReader.class).register(CacheConfigWriter.class);
あるサービスに非同期リクエストを行います
asyncResponse.resume(result); // result is a string
クライアント上
Future<String> future = asyncInvoker.post(entity, String.class);
私の観察では、ランダムに応答が空ですが、サーバー ログでは空でない結果を確認できます。デバッグ時に、呼び出すスレッドが2つあることがわかりました
JaxrsClientCallback . handleResponse()
そのうちの 1 つは実際の結果で、もう 1 つは空です。最初に実行される内容に基づいて、結果は実際の文字列または空になります。呼び出しのトレースには、フェーズ インターセプター チェーンからの呼び出しが含まれています。これは、クライアントをカスタム リーダーおよびライターに登録した場合にのみ発生します。json でリクエスト本文を設定すると、1 つのスレッドだけがレスポンスを処理します。MessageBodyReaders / Writers の追加がこの問題を引き起こす理由を誰かが明らかにできますか?