1

我们正在为软件架构的学术课程开发一个应用程序,我们必须使用 Java EE 来实现它。

本质上我们必须实现一个分布式的 Hearts 游戏(你知道 Windows 游戏吗?我想是的)。

我们希望使用 SOAP 使客户端能够与服务器(在我们的例子中为 glassfish)通信,但为​​了避免轮询,我们需要将 Web 服务端点实现为 @WebServiceProvider。

这种 endopoit 可以实现 asyncProvider 接口,使我们能够对soap请求和soap响应进行解耦。但是这里我们有两个大问题:

  • 第一个是:glassfish(没有任何额外设置)可以使用http-thread-pool中的一组只有5个线程。在前五个请求之后,我们“阻塞”了端点 servlet。这是 asyncProvider 的正确工作模式吗?在调用终止之后,我们期望 servlet 线程被释放以处理另一个传入请求,但显然,它不能以这种方式工作。这不是请求的真正“异步”管理。我们错了吗?

  • 第二个:我们很确定我们引入的问题与第一个问题是严格相关的。在线程池大小为 5 的情况下发出 10 个请求,我们有这样的场景:前 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 大小,我们就没有问题。

对我们有什么建议吗?

4

0 回答 0