2

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 の追加がこの問題を引き起こす理由を誰かが明らかにできますか?

4

0 に答える 0