1

私たちはソフトウェア アーキテクチャのアカデミック コース用のアプリケーションを開発しており、それを実装するには Java EE を使用する必要があります。

基本的に、分散型 Hearts ゲームを実装する必要があります (Windows ゲームを知っていますか? 私はそう思います)。

SOAP を使用して、クライアントがサーバー (この場合は Glassfish) と通信できるようにしたいのですが、ポーリングを避けるために、Web サービス エンドポイントを @WebServiceProvider として実装する必要があります。

この種のエンドポイトは、soap リクエストと SOAP レスポンスを切り離すことを可能にする asyncProvider インターフェースを実装できます。しかし、ここには 2 つの大きな問題があります。

  • 1 つ目は、glassfish (追加設定なし) は、http-thread-pool で 5 つのスレッドのセットしか使用できないことです。最初の 5 つのリクエストの後、エンドポイント サーブレットは「ブロック」されます。それは asyncProvider の動作する正しいモードですか? インボークの終了後、サーブレット スレッドが解放されて別の受信リクエストを処理することを期待していましたが、明らかに、この方法では機能しません。これは、リクエストの実際の「非同期」管理ではありません。私たちは間違っていますか?

  • 2 つ目: 私たちが導入している問題は、最初の問題と厳密に相関していると確信しています。スレッド プール サイズ 5 で 10 個のリクエストを行うシナリオは次のとおりです。最初の 5 つのリクエストは適切に処理され、20 秒のタイムアウトの後、正しくクライアントに送信されます。6 番目から最後まで、いくつかの間違いがあります。サーバー側ではすべて問題ありませんが、クライアント側では、次のような例外が発生することがあります。

java.util.concurrent.ExecutionException: javax.xml.ws.WebServiceException: java.net.SocketException: サーバーからの予期しないファイルの終わり

at com.sun.xml.ws.util.CompletedFuture.get(CompletedFuture.java:72)

at client.Client$1.handleResponse(Client.java:79)

at com.sun.xml.ws.client.AsyncResponseImpl.set(AsyncResponseImpl.java:125)

at com.sun.xml.ws.client.sei.AsyncMethodHandler$SEIAsyncInvoker$1.onCompletion(AsyncMethodHandler.java:202)

at com.sun.xml.ws.client.Stub$1.onCompletion(Stub.java:397)

at com.sun.xml.ws.api.pipe.Fiber.completionCheck(Fiber.java:503)

at com.sun.xml.ws.api.pipe.Fiber.run(Fiber.java:423)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:662)

原因: javax.xml.ws.WebServiceException: java.net.SocketException: サーバーからの予期しないファイルの終わり

at com.sun.xml.ws.transport.http.client.HttpClientTransport.readResponseCodeAndMessage(HttpClientTransport.java:214)

at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:162)

at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:93)

at com.sun.xml.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:105)

at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:629)

at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:588)

at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:573)

at com.sun.xml.ws.api.pipe.Fiber.run(Fiber.java:422)

... 3 more

原因: java.net.SocketException: サーバーからの予期しないファイルの終わり

at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:769)

at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)

at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:766)

at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)

at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)

at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)

at com.sun.xml.ws.transport.http.client.HttpClientTransport.readResponseCodeAndMessage(HttpClientTransport.java:210)

... 10 more

サーバー側で例外なくチェックした後、soap 応答の内容が検証され、整形式であることを強調したいと思います。

http-thread-pool サイズよりも少ない数のリクエストを送信しても、問題はありません。

何か提案はありますか?

4

0 に答える 0