Почему я получаю SocketTimeoutException в веб-службе в Linux, но не в Windows? - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть веб-сервис следующим образом:

    @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. На Windows нет проблем, но Linux ведет себя совершенно иначе! клиент вызывает этот веб-сервис из 2-4 потоков постоянно. через некоторое время он возвращает «Получил входной поток от клиента .... Доступные байты: 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...