[ https://issues.apache.org/jira/browse/WW-4386?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lukasz Lenart closed WW-4386. ----------------------------- > "java.io.IOException: Broken pipe" occurred > ------------------------------------------- > > Key: WW-4386 > URL: https://issues.apache.org/jira/browse/WW-4386 > Project: Struts 2 > Issue Type: Bug > Components: Core Interceptors > Affects Versions: 2.3.16.3 > Environment: OS:RHEL Server 5.3 > JRE:1.7.0_09 > Application Server:Tomcat 8.0.9 > Reporter: mougenko > Priority: Blocker > > When I call Action, Broken pipe Exception occur. > ・If don't use interceptor, Exception does not occur. > ・If action result type is not stream, Exception does not occur. > ・If read HttpResponse, Exception does not occur. > ・If OS is Windows, Exception does not occur. > ・If use Tomcat BIO protocol, Exception does not occur. > {code:title=StackTrace|borderStyle=solid} > org.apache.catalina.connector.ClientAbortException: java.io.IOException: > Broken pipe > at > org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:389) > at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:426) > at > org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:338) > at > org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:291) > at > org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:151) > at > org.apache.struts2.dispatcher.StreamResult.doExecute(StreamResult.java:305) > at > org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186) > at > com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:371) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275) > at > org.apache.struts2.interceptor.DeprecationInterceptor.intercept(DeprecationInterceptor.java:41) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167) > at > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265) > at > org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) > at > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:254) > at > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:254) > at > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) > at > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:139) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) > at > org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) > at > com.opensymphony.xwork2.ActionChainResult.execute(ActionChainResult.java:233) > at > com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:371) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275) > 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:89) > at sun.nio.ch.IOUtil.write(IOUtil.java:60) > at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:450) > at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:127) > at > org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) > at > org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:173) > at > org.apache.coyote.http11.InternalNioOutputBuffer.writeToSocket(InternalNioOutputBuffer.java:139) > at > org.apache.coyote.http11.InternalNioOutputBuffer.flushBuffer(InternalNioOutputBuffer.java:244) > at > org.apache.coyote.http11.InternalNioOutputBuffer.addToBB(InternalNioOutputBuffer.java:189) > 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:257) > at org.apache.coyote.Response.doWrite(Response.java:492) > at > org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:384) > ... 164 more > {code} > {code:title=TestAction.java|borderStyle=solid} > package sample.action; > import java.io.ByteArrayInputStream; > import java.io.InputStream; > import org.apache.commons.logging.Log; > import org.apache.commons.logging.LogFactory; > import org.apache.struts2.convention.annotation.Action; > import org.apache.struts2.convention.annotation.InterceptorRef; > import org.apache.struts2.convention.annotation.ParentPackage; > import org.apache.struts2.convention.annotation.Result; > import com.opensymphony.xwork2.ActionSupport; > @ParentPackage(value = "default") > @InterceptorRef("first") > public class TestAction extends ActionSupport { > public InputStream inputStream; > private static final Log log = LogFactory.getLog(TestAction.class); > @Action(value = "test", results = { > @Result(name = "error", type = "stream", location = > "inputStream", params = {"contentType", "text/xml; charset=UTF-8" }), > @Result(name = "success", type = "stream", location = > "inputStream", params = {"contentType", "text/xml; charset=UTF-8" }) > }) > public String execute() throws Exception { > try { > log.info("Start"); > inputStream = new > ByteArrayInputStream("<result>test</result>".getBytes()); > log.info("End"); > return "success"; > } catch (Exception e) { > log.error(e.getMessage()); > return "error"; > } > } > } > {code} > {code:title=FirstInterceptor.java|borderStyle=solid} > package sample.interceptor; > import org.apache.commons.logging.Log; > import org.apache.commons.logging.LogFactory; > import com.opensymphony.xwork2.ActionInvocation; > import com.opensymphony.xwork2.interceptor.AbstractInterceptor; > public class FirstInterceptor extends AbstractInterceptor { > private static final Log log = > LogFactory.getLog(FirstInterceptor.class); > @Override > public void init() { > super.init(); > } > @Override > public String intercept(ActionInvocation invocation) throws Exception { > log.info("Start"); > String result = ""; > try { > result = invocation.invoke(); > } catch (Exception e) { > log.fatal(e.getMessage(), e); > return "error"; > } > log.info("End"); > return result; > } > } > {code} > {code:title=ClientMain.java|borderStyle=solid} > package sample.client; > import java.io.IOException; > import java.util.ArrayList; > import java.util.List; > import org.apache.http.HttpResponse; > import org.apache.http.NameValuePair; > import org.apache.http.client.entity.UrlEncodedFormEntity; > import org.apache.http.client.methods.HttpPost; > import org.apache.http.impl.client.DefaultHttpClient; > import org.apache.http.message.BasicNameValuePair; > public class ClientMain { > public static void main(String[] args) { > try { > for(int i = 0 ; i < 10 ; i++) { > sendHttpRequest("http://<Host>/<context>/test"); > } > System.out.println("finish"); > } catch(Exception e) { > e.printStackTrace(); > } > } > private static void sendHttpRequest(final String url) throws > IOException { > HttpPost httpPost = null; > try { > httpPost = new HttpPost(url); > DefaultHttpClient httpclient = new DefaultHttpClient(); > List<NameValuePair> params = new > ArrayList<NameValuePair>(); > params.add(new BasicNameValuePair("client_type", "")); > httpPost.setEntity(new UrlEncodedFormEntity(params, > "UTF-8")); > HttpResponse response = httpclient.execute(httpPost); > if (response.getStatusLine().toString().indexOf(" 200 > ") == -1) { > // do something > } > } finally { > if (httpPost != null) { > httpPost.abort(); > } > } > } > } > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)