代码之家  ›  专栏  ›  技术社区  ›  bobbyrne01

如果客户端终止RESTful请求,则显式处理IOException

  •  0
  • bobbyrne01  · 技术社区  · 7 年前

    我有一个定制的客户机工具,它向我的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
    
    0 回复  |  直到 7 年前