我有一个如下的网络服务:
@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)