You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Stephan Siano (JIRA)" <ji...@apache.org> on 2016/07/14 12:11:20 UTC

[jira] [Updated] (CAMEL-10147) MesssageHistory will take very long time for large expressions

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

Stephan Siano updated CAMEL-10147:
----------------------------------
    Description: 
If a route contains a large expressen (a few MB) and an error occurs the message history feature will take a very long time.

The following code is a slightly modified unit test from camel-core
{code}
import org.apache.camel.CamelExecutionException;
import org.apache.camel.ContextTestSupport;
import org.apache.camel.builder.RouteBuilder;

/**
 * @version 
 */
public class SedaInOutWithErrorTest extends ContextTestSupport {

    public void testInOutWithError() throws Exception {
        getMockEndpoint("mock:result").expectedMessageCount(0);

        try {
            template.requestBody("direct:start", "Hello World", String.class);
            fail("Should have thrown an exception");
        } catch (CamelExecutionException e) {
            assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
            assertEquals("Damn I cannot do this", e.getCause().getMessage());
        }

        assertMockEndpointsSatisfied();
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                StringBuilder sb = new StringBuilder();
                sb.append("Something ");
                for (int i=0; i<1000000; i++) {
                    sb.append("very ");
                }
                sb.append("long");
                
                from("direct:start").to("seda:foo");

                from("seda:foo").transform(constant(sb.toString()))
                    .throwException(new IllegalArgumentException("Damn I cannot do this"))
                    .to("mock:result");
            }
        };
    }
}
{code}

This test will set the body to a 5MB test and then run into an error. This will run for a very long time, because MessageHelper.doDumpMessageHistoryStacktrace() will first run a URISupport.sanitizeUri() on the expression and then cut it off to 78 characters.

If we cut the expression of (e.g. to 100 characters) before doing the sanitizeUri() this will run much faster in this case (and not slower for smaller expressions).

  was:
If a route contains a large expressen (a few MB) and an error occurs the message history feature will take a very long time.

The following code is a slightly modified unit test from camel-core
{code}
import org.apache.camel.CamelExecutionException;
import org.apache.camel.ContextTestSupport;
import org.apache.camel.builder.RouteBuilder;

/**
 * @version 
 */
public class SedaInOutWithErrorTest extends ContextTestSupport {

    public void testInOutWithError() throws Exception {
        getMockEndpoint("mock:result").expectedMessageCount(0);

        try {
            template.requestBody("direct:start", "Hello World", String.class);
            fail("Should have thrown an exception");
        } catch (CamelExecutionException e) {
            assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
            assertEquals("Damn I cannot do this", e.getCause().getMessage());
        }

        assertMockEndpointsSatisfied();
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                StringBuilder sb = new StringBuilder();
                sb.append("Something ");
                for (int i=0; i<1000000; i++) {
                    sb.append("very ");
                }
                sb.append("long");
                
                from("direct:start").to("seda:foo");

                from("seda:foo").transform(constant(sb.toString()))
                    .throwException(new IllegalArgumentException("Damn I cannot do this"))
                    .to("mock:result");
            }
        };
    }
}
{code}

This test will set the body to a 5MB test and then run into an error. This will run for a very long time, because MessageHelper.doDumpMessageHistoryStacktrace() will first run a URISupport.sanitizeUri() on the expression and then cut it off to 78 characters.

If we cut the expression of (e.g. to 100 characters) before doing the sanitizeUri() this will run much faster in all cases.


> MesssageHistory will take very long time for large expressions
> --------------------------------------------------------------
>
>                 Key: CAMEL-10147
>                 URL: https://issues.apache.org/jira/browse/CAMEL-10147
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>    Affects Versions: 2.17.1
>            Reporter: Stephan Siano
>            Assignee: Stephan Siano
>              Labels: performance
>
> If a route contains a large expressen (a few MB) and an error occurs the message history feature will take a very long time.
> The following code is a slightly modified unit test from camel-core
> {code}
> import org.apache.camel.CamelExecutionException;
> import org.apache.camel.ContextTestSupport;
> import org.apache.camel.builder.RouteBuilder;
> /**
>  * @version 
>  */
> public class SedaInOutWithErrorTest extends ContextTestSupport {
>     public void testInOutWithError() throws Exception {
>         getMockEndpoint("mock:result").expectedMessageCount(0);
>         try {
>             template.requestBody("direct:start", "Hello World", String.class);
>             fail("Should have thrown an exception");
>         } catch (CamelExecutionException e) {
>             assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
>             assertEquals("Damn I cannot do this", e.getCause().getMessage());
>         }
>         assertMockEndpointsSatisfied();
>     }
>     @Override
>     protected RouteBuilder createRouteBuilder() throws Exception {
>         return new RouteBuilder() {
>             @Override
>             public void configure() throws Exception {
>                 StringBuilder sb = new StringBuilder();
>                 sb.append("Something ");
>                 for (int i=0; i<1000000; i++) {
>                     sb.append("very ");
>                 }
>                 sb.append("long");
>                 
>                 from("direct:start").to("seda:foo");
>                 from("seda:foo").transform(constant(sb.toString()))
>                     .throwException(new IllegalArgumentException("Damn I cannot do this"))
>                     .to("mock:result");
>             }
>         };
>     }
> }
> {code}
> This test will set the body to a 5MB test and then run into an error. This will run for a very long time, because MessageHelper.doDumpMessageHistoryStacktrace() will first run a URISupport.sanitizeUri() on the expression and then cut it off to 78 characters.
> If we cut the expression of (e.g. to 100 characters) before doing the sanitizeUri() this will run much faster in this case (and not slower for smaller expressions).



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)