You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "mougenko (JIRA)" <ji...@apache.org> on 2014/08/20 03:48:18 UTC

[jira] [Resolved] (WW-4386) "java.io.IOException: Broken pipe" occurred

     [ https://issues.apache.org/jira/browse/WW-4386?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

mougenko resolved WW-4386.
--------------------------

       Resolution: Not a Problem
    Fix Version/s:     (was: 2.3.18)

This is not a bug in Struts.
Tomcat bug.

> "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.2#6252)