我有一个定制的客户机工具,它向我的RESTful服务器API发出HTTP请求。
请求可能需要大约1分钟(因为文件是以多部分的方式上载的,作为用户配置文件的一部分),并且可能用户可以终止客户端进程或关闭终端窗口。导致所有文件未上载。
如果客户端工具被终止(终止连接),
java.io.IOException
在服务器日志中看到,但看起来像
Exception
由容器处理/使用(使用WAS Liberty Profile)。当这种情况发生时,我想做一些额外的服务器端处理,以清理不完整的配置文件。
我想用
ExceptionMapper
接住
IOException
toResponse()
MyApplication.java
:
package com.test.server;
import com.test.exceptions.IOExceptionMapper;
import com.test.server.Service;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class MyApplication extends Application {
@Override
public final Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(MyService.class);
classes.add(MyApplication.class);
classes.add(IOExceptionMapper.class);
return classes;
}
}
MyService.java
:
package com.test.server;
@WebService
@Path("/")
public class MyService {
@POST
@Path("/profile")
@Produces(MediaType.TEXT_PLAIN)
public Response createProfile(@javax.ws.rs.core.Context final HttpHeaders httpHeaders,
@javax.ws.rs.core.Context final HttpServletRequest request) throws IOException {
// do things, duration is ~1 minute
ResponseBuilder rb = Response.status(Status.OK).entity("Created.");
return rb.build();
}
}
IOExceptionMapper.java
package com.test.exceptions;
import java.io.IOException;
import javax.inject.Singleton;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
@Provider
@Singleton
public class IOExceptionMapper implements ExceptionMapper<IOException> {
@Override
public Response toResponse(IOException ex) {
System.out.println("toResponse IOExceptionMapper");
return Response.status(404).entity(ex.getMessage()).type("text/plain").build();
}
}
源代码段
web.xml
:
<servlet>
<description>API</description>
<display-name>RESTAPI</display-name>
<servlet-name>RESTAPI</servlet-name>
<servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.test.server.MyApplication</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.test.exceptions</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
服务器日志:
[INFO ] FFDC1015I: An FFDC Incident has been created: "java.io.IOException: Connection closed: Read failed. Possible end of stream encountered. com.ibm.ws.webcontainer.security.PostParameterHelper 402" at ffdc_19.01.30_18.23.41.0.log
[INFO ] FFDC1015I: An FFDC Incident has been created: "java.io.IOException: Connection closed: Read failed. Possible end of stream encountered. com.ibm.wsspi.http.ee7.HttpInputStreamEE7 129" at ffdc_19.01.30_18.23.41.1.log
[INFO ] FFDC1015I: An FFDC Incident has been created: "java.io.IOException: SRVE0216E: post body contains less bytes than specified by content-length. com.ibm.ws.webcontainer.security.PostParameterHelper 402" at ffdc_19.01.30_18.23.41.2.log
[INFO ] FFDC1015I: An FFDC Incident has been created: "java.io.IOException: Connection closed: Read failed. Possible end of stream encountered. org.apache.cxf.transport.http.AbstractHTTPDestination$BackChannelConduit 786" at ffdc_19.01.30_18.23.45.0.log
[INFO ] FFDC1015I: An FFDC Incident has been created: "java.io.IOException: Connection closed: Read failed. Possible end of stream encountered. com.ibm.ws.webcontainer.srt.SRTServletRequest.finish 875" at ffdc_19.01.30_18.23.45.1.log