我们正在开发软件架构学术课程的应用程序,我们必须使用Java EE来实现它。
基本上我们必须实现分布式Hearts游戏(你知道Windows游戏吗?我想是这样)。
我们希望使用SOAP使客户端能够与服务器通信(在我们的例子中是glassfish),但为了避免轮询,我们需要将Web服务端点实现为@WebServiceProvider。
这种endopoit可以实现asyncProvider接口,允许我们对soap请求和soap响应进行decoplue。但在这里我们有两大问题:
第一个是:glassfish(没有任何其他设置)可以在http-thread-pool中使用一组只有5个线程。在前五个请求之后,我们将endopoint servlet“阻止”。这是asyncProvider工作的正确模式吗?在调用终止之后,我们期望servlet线程被释放以处理另一个传入请求,但显然,它不能以这种方式工作。这不是对请求的真正“异步”管理。我们错了吗?
第二个问题:我们非常肯定我们引入的问题与第一个问题严格相关。在线程池大小为5的情况下发出十个请求,我们有这样的场景:前五个请求得到很好的处理,在超时20秒后,它们被正确地发送到客户端。从第六个到最后一个,我们有一些错误:在服务器端一切都很好,但在客户端,有时我们有这样的删除:
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大小,我们没有问题。
对我们有任何建议吗?