为什么我在Linux上的Web服务中获得SocketTimeoutException但在Windows上却没有?

时间:2011-11-02 14:57:22

标签: java linux web-services windows-7

我有一个如下的网络服务:

    @WebServiceProvider
    @BindingType(HTTPBinding.HTTP_BINDING)
    @ServiceMode(value = Service.Mode.MESSAGE)
    public class Service implements Provider<DataSource> {

    @Resource
protected WebServiceContext m_wsContext;
@Override
public DataSource invoke(final DataSource dataSource) throws WebServiceException {
    final MessageContext messageContext = m_wsContext.getMessageContext();
    final String method = (String) messageContext.get(MessageContext.HTTP_REQUEST_METHOD);
    if (method.equals("POST"))
        return invokePostMethod(dataSource, messageContext);
    throw new HTTPException(404);
}

private DataSource invokePostMethod(final DataSource dataSource, final MessageContext messageContext) {

    return new DataSource()  {

        @Override
        public InputStream getInputStream() {
            try {
                InputStream in = dataSource.getInputStream();
                System.out.println("Got input stream from client....Available bytes: " + in.available());


                in.close();

            } catch (IOException e) {
                                    return null;
            }
            return null;
        }

        @Override
        public OutputStream getOutputStream() {
            return null;
        }
        @Override
        public String getContentType() {
            return "text/plain";
        }
        @Override
        public String getName() {
            return "";
        }
    };
}
   }

现在我在Red Hat linux和Win7上执行这个Web服务。 在Windows上没有问题,但Linux的行为完全不同! 客户端不断地从2-4个线程调用此Web服务。 一段时间后它返回“从客户端获得输入流....可用字节:0”(日志消息),过了一会儿我得到一个例外:

     java.net.SocketTimeoutException: no data received
    at sun.net.httpserver.Request$ReadStream.block(Unknown Source)
    at sun.net.httpserver.Request$ReadStream.read(Unknown Source)
    at java.io.BufferedInputStream.fill(Unknown Source)
    at java.io.BufferedInputStream.read1(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    at sun.net.httpserver.FixedLengthInputStream.readImpl(Unknown Source)
    at sun.net.httpserver.LeftOverInputStream.read(Unknown Source)
    at java.io.FilterInputStream.read(Unknown Source)
    at com.sun.xml.ws.transport.http.server.ServerConnectionImpl$1.close(ServerConnectionImpl.java:142)
    at com.shunra.javadestination.webservices.UploadFileService$1.getInputStream(Unknown Source)
    at com.sun.xml.ws.encoding.xml.XMLMessage.create(XMLMessage.java:148)
    at com.sun.xml.ws.server.provider.XMLProviderArgumentBuilder$DataSourceParameter.getResponseMessage(XMLProviderArgumentBuilder.java:110)
    at com.sun.xml.ws.server.provider.XMLProviderArgumentBuilder$DataSourceParameter.getResponseMessage(XMLProviderArgumentBuilder.java:96)
    at com.sun.xml.ws.server.provider.ProviderArgumentsBuilder.getResponse(ProviderArgumentsBuilder.java:80)
    at com.sun.xml.ws.server.provider.SyncProviderInvokerTube.processRequest(SyncProviderInvokerTube.java:91)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:598)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:557)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:542)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:439)
    at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:243)
    at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:471)
    at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244)
    at com.sun.xml.ws.transport.http.server.WSHttpHandler.handleExchange(WSHttpHandler.java:106)
    at com.sun.xml.ws.transport.http.server.WSHttpHandler.handle(WSHttpHandler.java:91)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
    at sun.net.httpserver.AuthFilter.doFilter(Unknown Source)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
    at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(Unknown Source)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
    at sun.net.httpserver.ServerImpl$Exchange.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

0 个答案:

没有答案