1. 程式人生 > >錯誤號org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe

錯誤號org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe

        在說這個錯誤之前,我先介紹下背景,我們專案用的是SpringBoot框架,整合Hprose+spring+mybatis,Hprose是什麼,可以參考我上篇對Hprose的一個簡單介紹。當前專案業務是抓取一個網站近5年的足球籃球的賠率資料。所以這是個按照日期進行的一個大迴圈。介於Hprose特性,Hprose服務端的處理時間會特別長,這是個重點。

        在專案上線抓取資料時,linux環境下,我們的程式出現了這樣一個錯誤,如下:

2016-06-16 12:47:52.190  WARN 10150 --- [http-nio-8082-exec-2] o.a.commons.httpclient.HttpMethodBase    : Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.
2016-06-16 12:52:30.077  WARN 10150 --- [http-nio-8082-exec-3] o.apache.catalina.core.AsyncContextImpl  : onTimeout() failed for listener of type [org.apache.catalina.core.AsyncListenerWrapper]

java.lang.NullPointerException: null
        at hprose.server.HproseService.getErrorMessage(HproseService.java:512)
        at hprose.server.HproseService.sendError(HproseService.java:522)
        at hprose.server.HproseHttpService$1.onTimeout(HproseHttpService.java:208)
        at org.apache.catalina.core.AsyncListenerWrapper.fireOnTimeout(AsyncListenerWrapper.java:40)
        at org.apache.catalina.core.AsyncContextImpl.timeout(AsyncContextImpl.java:155)
        at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:292)
        at org.apache.coyote.http11.AbstractHttp11Processor.asyncDispatch(AbstractHttp11Processor.java:1715)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

2016-06-16 12:52:30.084  INFO 10150 --- [http-nio-8082-exec-3] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'springMvc'
2016-06-16 12:52:30.084  INFO 10150 --- [http-nio-8082-exec-3] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'springMvc': initialization started
2016-06-16 12:52:30.086  INFO 10150 --- [http-nio-8082-exec-3] .s.AnnotationConfigWebApplicationContext : Refreshing WebApplicationContext for namespace 'springMvc-servlet': startup date [Thu Jun 16 12:52:30 GMT 2016]; parent: org.springframework.boot
[email protected]
1ed431e9 2016-06-16 12:52:30.145 INFO 10150 --- [http-nio-8082-exec-3] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'springMvc': initialization completed in 61 ms 2016-06-16 12:52:30.176 INFO 10150 --- [http-nio-8082-exec-3] c.z.d.i.web.interceptor.LogInterceptor : 請求日誌,ip=127.0.0.1,uri=/error,params={} 2016-06-16 12:52:30.230 ERROR 10150 --- [http-nio-8082-exec-3] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error] org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:393) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:426) at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:342) at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:317) at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:110) at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1044) at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:854) at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:265) at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:100) at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:222) at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:183) at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:80) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:817) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:731) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:870) at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:844) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:468) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318) at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:445) at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:304) at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:399) at org.apache.catalina.core.AsyncContextImpl.setErrorState(AsyncContextImpl.java:460) at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:293) at org.apache.coyote.http11.AbstractHttp11Processor.asyncDispatch(AbstractHttp11Processor.java:1715) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: java.io.IOException: Broken pipe at sun.nio.ch.FileDispatcherImpl.write0(Native Method) at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) at sun.nio.ch.IOUtil.write(IOUtil.java:65) at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:124) at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:172) at org.apache.coyote.http11.InternalNioOutputBuffer.writeToSocket(InternalNioOutputBuffer.java:139) at org.apache.coyote.http11.InternalNioOutputBuffer.addToBB(InternalNioOutputBuffer.java:197) at org.apache.coyote.http11.InternalNioOutputBuffer.access$000(InternalNioOutputBuffer.java:41) at org.apache.coyote.http11.InternalNioOutputBuffer$SocketOutputBuffer.doWrite(InternalNioOutputBuffer.java:320) at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:116) at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:256) at org.apache.coyote.Response.doWrite(Response.java:501) at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388) ... 41 common frames omitted 2016-06-16 12:52:30.240 INFO 10150 --- [http-nio-8082-exec-3] c.z.d.i.web.interceptor.LogInterceptor : 請求日誌,ip=127.0.0.1,uri=/port,params={} 2016-06-16 12:52:30.244 ERROR 10150 --- [http-nio-8082-exec-3] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error]

       這個錯誤是在tomcat啟動執行後的3分鐘左右出現。這個錯誤,表面上來看,在tomcat容器中執行過程中,出現null錯誤。我在網上找到一些對於此錯誤的相關解決辦法,有的人說是專案打出的日誌太多才導致的這個錯誤,清理相關日誌之後,錯誤仍然出現。

        難道是我專案出現了什麼問題才導致的tomcat容器停止的?於是我在日誌中找到出現錯誤的那一天,開始進行測試,發現一個奇怪的現象,本地專案執行大概10min中左右Hprose的服務端出現null錯誤,但是緊接著會跳過這個錯誤,相當於重新啟動tomcat,繼續向前進行,如下圖:


與此同時,Hprose的客戶端停止,出現以下錯誤:


        難道是我專案處理的不規範,某個值為空了?所以導致Hprose客戶端停止,可是這個時候tomcat為什麼會重連,而且還能連結成功?

        這些都是問題,我將專案中的方法都用try catch包裹,然後找到出現這個錯誤前打出的日誌,根據這個日誌設定了斷點,可是不巧的是,這個錯誤在這個時候不出現了,可是卻在執行大概10分鐘左右的時候再次出現,而且並未出現我catche到的日誌記錄。

       就這樣排除是程式程式碼的問題。我告訴老大後,老大猜測我用的Hprose客戶端是java的,他用的Hprose客戶端是PHP的,是不是客戶端的問題。雖然老大這麼說了,但是我覺得java的Hprose客戶端和PHP的Hprose客戶端,除了語言不一樣,呼叫方式不一樣之外,其他的沒什麼區別啊?

       於是我就想著避免Hprose的呼叫,改走rest呼叫。我把專案改成rest風格後,專案執行一段時間後報這個錯誤,如圖:


別忘記,rest風格的專案在呼叫的時候其實使用的是Http請求。

       說到這裡,我就明白這個錯誤大概是怎麼產生的了,產生這個錯誤的原因,還得從Hprose說起。Hprose是一個屬於RPC框架風格的框架,其實不管是什麼RPC框架風格還是DI框架風格還是Rest風格,涉及到這種客戶端服務端,其實最終都會歸結到網路傳輸。所以這是個網路傳輸問題,服務端在沒有走完自己的服務,客戶端已經停止了,所以才有這個錯誤。Hprose有一個屬性是延長服務端時間,只要修改這個屬性,就好了。

       因此修改Hprose屬性如下:

      再次測試, 問題解決。

總結:

       通過這個問題,讓我跟進一步認識到HProse,瞭解到不管是什麼框架風格,管你什麼DI、Rest、Rpc,最終歸根到底所謂的遠端呼叫都需要走到網路傳輸。知其然還要知其所以然。




相關推薦

錯誤org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe

        在說這個錯誤之前,我先介紹下背景,我們專案用的是SpringBoot框架,整合Hprose+spring+mybatis,Hprose是什麼,可以參考我上篇對Hprose的一個簡單介紹。當前專案業務是抓取一個網站近5年的足球籃球的賠率資料。所以這是個按照日期

java.io.IOException 斷開的管道 解決方法 ClientAbortException: java.io.IOException: Broken pipe

    今天公司技術支援的童鞋報告一個客戶的服務不工作了,緊急求助,於是遠端登陸上伺服器排查問題。    檢視採集資料的tomcat日誌,習慣性的先翻到日誌的最後去檢視有沒有異常的列印,果然發現了好幾種異常資訊,但是最多還是這個:24-Nov-2016 09:54:21.11

org.apache.catalina.connector.ClientAbortException

org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error    &nbs

org.apache.catalina.connector.ClientAbortException:null

參考文章: org.apache.catalina.connector.ClientAbortException: null 談談request和response的頁面跳轉   使用如下程式碼時: ServletOutputStream outputStr

hadoop上傳檔案錯誤org.apache.hadoop.ipc.RemoteException(java.io.IOException)

部落格引用處(以下內容在原有部落格基礎上進行補充或更改,謝謝這些大牛的部落格指導): hadoop上傳檔案錯誤org.apache.hadoop.ipc.RemoteException(java.io.IOException) 搭建好hadoop後使用hadoop fs -put 命令上

org.apache.hadoop.ipc.RemoteException(java.io.IOException)異常

       最近在除錯flink程式時,發現程式起不來,檢視錯誤日誌和hadoop相關,我的程式與hadoop相關的只有設定了checkpoint的路徑是hdfs的一個目錄路徑。 錯誤日誌最後的錯誤大致是: org.apache.hadoop.i

JavaWEB專案報java.io.IOException: Broken pipe異常

分析系統日誌的時候,經常遇到java.io.IOException: Broken pipe異常,但是又找不到具體原因,很難復現,之前也在網上查過這個問題,但是相關的資料很少,今天重新搜尋了相關問題,找到了些靈感。 這個異常是tomcat的connector在執行寫操作的時候發生的,

java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequ

轉自:https://blog.csdn.net/iteye_17476/article/details/82651580 java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to

WARN hdfs.DFSClient: DataStreamer Exception org.apache.hadoop.ipc.RemoteException(java.io.IOExcept

使用web UI執行pi例項驗證hadoop叢集是否啟動成功 報如下錯誤: Number of Maps  = 10 Samples per Map = 10 18/09/29 19:32:55 WARN hdfs.DFSClient: DataStreamer Ex

錯誤處理:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter

部署專案時,啟動Tomcat一直出錯:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilterSEVERE: End event threw exception java.lang

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleExcept問題解決方案

log blank article 問題解決 安裝路徑 model row spa exec 在部署Dynamic Web Project時,如果正確配置web.xml或者標註時,仍然出現以上異常的話,可以嘗試以下內容講解的方法:   首先,雙擊eclipse中的serve

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]

pool arr fail val tst .net bre div manifest 本文為博主原創,未經允許不得轉載:   被坑了好長時間的bug,差點就要重新配置環境,重新下載,重新開始的境遇。在此記錄一下: 首先展示一下報錯的異常: 19-Apr-2018 09:

java.lang.ClassNotFoundException: org.apache.catalina.servlet4preview.http.HttpServletRequest

pool prot tor lin autowire brush wrap merge gets 遇到的問題如下:java.lang.ClassNotFoundException: org.apache.catalina.servlet4preview.http.Http

500 :java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor cannot be cas

啟動專案點選上傳功能報錯:500 :java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.AnnotationProcess

Java 錯誤提示org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException

java 操作excel檔案 釋出後報錯 org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException XSSFWorkbook xwb = new XSSFWorkbook(fileName); 這句報錯 使用

maven專案用tomcat外掛啟動失敗,java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException

建立maven專案的時候,配置tomcat外掛啟動失敗, java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngi

【Tomcat報錯】錯誤:找不到或無法載入主類 org.apache.catalina.startup.Bootstrap

報錯: 錯誤:找不到或無法載入主類 org.apache.catalina.startup.Bootstraporg.apache.catalina.startup.Bootstrap 描述: 這是由於找不到tomcatan安裝路徑bin 目錄下的bootst

Linux下啟動tomcat報錯RROR org.apache.catalina.core.StandardContext- Error starting static Resources java.lang.IllegalArgumentException: Document base /home

部署專案的時候,重啟tomcat,死活起不來,很鬱悶,網上巴拉了半天,結合自己的情況,找到了原因; 錯誤日誌資訊: 2018-12-13 13:52:26,992 [main] INFO org.apache.catalina.core.AprLifecycleListener- The APR

jsp一直出現ClassLoader報錯:org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1

!!!!!!此報錯應該是伺服器和servlet專案的  jdbc  載入失敗,所以針對專案目錄結構,把所有可以新增library的地方都載入了這個!!!!!!!同時將此jar檔案拷貝到Tomcat的目錄資料夾Bin:最後解決問題的是當我把jar檔案複製到這目錄下,才解決:co

[無異常,才正常]java.lang.ClassNotFoundException: org.apache.catalina.startup.VersionLoggerListener

     Documentation at /docs/config/server.html --><Server port="8005" shutdown="SHUTDOWN">  <!--<Listener className="org.apache.catalina.sta