避免日志充满java.io.IOException:管道损坏

时间:2018-02-01 13:55:40

标签: java tomcat spring-boot

我在一个浏览器上使用Server-Sent事件,在后端使用Spring启动应用程序。当我击落客户端时,我得到了下一个例外:

14:35:09.458 [http-nio-8084-exec-25] ERROR o.a.c.c.C.[Tomcat].[localhost] - Exception Processing ErrorPage[errorCode=0, location=/error]
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe

我理解这是预期的行为;另一方面,我的应用程序工作正常,但我有可怕的日志充满了这些例外。我猜这是由Tomcat造成的。有没有办法捕获这些异常,或者至少阻止Tomcat将此异常堆栈跟踪写入日志?我的意思是,不修改Tomcat的代码。

1 个答案:

答案 0 :(得分:0)

要防止日志中出现此异常,您可以尝试对执行推送客户端的代码进行一些更改。这是我的例子。我听api调用然后它叫我把socket连接到客户端。我想你可以理解代码:

 @GetMapping("/api/status/{groupId}/{groupstatusId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
@ExceptionHandler(IOException.class)
public void listenToNewStatus(@PathVariable Long groupId, @PathVariable String groupstatusId, IOException e) {
    Group group = groupDTOService.findById(groupId);
    if (group != null) {
        if (StringUtils.containsIgnoreCase(ExceptionUtils.getRootCauseMessage(e), "Broken pipe")) {
            logger.info("broken pipe");
        } else {
            template.convertAndSend("/topic/callstatus/" + group.getUser().getId(), groupstatusId);
        }

    }

在此代码中,为了防止管道损坏,我添加了注释@ExceptionHandler(IOException.class)并检查异常是否包含断开的管道,然后没有其他任何内容向客户端发送消息。