[ 
https://issues.apache.org/jira/browse/CAMEL-7644?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14321934#comment-14321934
 ] 

Claus Ibsen commented on CAMEL-7644:
------------------------------------

What is the status of this ticket?

> Scala camel DSL creates numerous DefaultCamelContext instances
> --------------------------------------------------------------
>
>                 Key: CAMEL-7644
>                 URL: https://issues.apache.org/jira/browse/CAMEL-7644
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-scala
>    Affects Versions: 2.13.1
>            Reporter: Bob Browning
>            Assignee: Willem Jiang
>
> Since the camel DSL is invoked prior to 
> `.addRoutesToCamelContext(CamelContext)` being invoked there is no camel 
> context set on the delegate java RouteBuilder which causes it to create a new 
> context when the first dsl method is invoked.
> With the implementation of CAMEL-7327 introduced in 2.13.1 which stores 
> created camel contexts in a set in `Container.Instance#CONTEXT`; this causes 
> instances of DefaultCamelContext to be leaked, they are never removed from 
> the static set. This is especially aparrent during unit testing.
> The following test shows that an additional context is registered for the 
> scala route builder as opposed to java. Verification of the leak can be 
> requires profiler and capturing of heap after termination of the test case 
> (in ParentRunner.java).
> {code:java}
> package org.apache.camel.scala.dsl.builder;
> import com.google.common.collect.Sets;
> import org.apache.camel.CamelContext;
> import org.apache.camel.ProducerTemplate;
> import org.apache.camel.builder.RouteBuilder;
> import org.apache.camel.impl.DefaultCamelContext;
> import org.apache.camel.spi.Container;
> import org.junit.After;
> import org.junit.Before;
> import org.junit.Test;
> import java.lang.ref.WeakReference;
> import java.util.Set;
> import static org.junit.Assert.assertEquals;
> public class BuggyScalaTest implements Container {
>   Set<CamelContext> managed = Sets.newHashSet();
>   @Before
>   public void setUp() throws Exception {
>     Container.Instance.set(this);
>   }
>   @After
>   public void tearDown() throws Exception {
>     Container.Instance.set(null);
>   }
>   @Test
>   public void testNameJava() throws Exception {
>     DefaultCamelContext defaultCamelContext = new DefaultCamelContext();
>     defaultCamelContext.addRoutes(new RouteBuilder() {
>       @Override
>       public void configure() throws Exception {
>         from("direct:start").log("a message");
>       }
>     });
>     defaultCamelContext.start();
>     ProducerTemplate producerTemplate = 
> defaultCamelContext.createProducerTemplate();
>     producerTemplate.start();
>     producerTemplate.sendBody("direct:start", "");
>     producerTemplate.stop();
>     defaultCamelContext.stop();
>     assertEquals(1, managed.size());
>   }
>   @Test
>   public void testNameScala() throws Exception {
>     DefaultCamelContext defaultCamelContext = new DefaultCamelContext();
>     defaultCamelContext.addRoutes(new SimpleRouteBuilder());
>     defaultCamelContext.start();
>     ProducerTemplate producerTemplate = 
> defaultCamelContext.createProducerTemplate();
>     producerTemplate.start();
>     producerTemplate.sendBody("direct:start", "");
>     producerTemplate.stop();
>     defaultCamelContext.stop();
>     assertEquals(1, managed.size()); // will equal 2
>   }
>   @Override
>   public void manage(CamelContext camelContext) {
>     managed.add(camelContext);
>   }
> }
> {code}
> {code:java}
>   package org.apache.camel.scala.dsl.builder
>   import org.apache.camel.scala.dsl.builder.RouteBuilder
>   class SimpleRouteBuilder extends RouteBuilder {
>     from("direct:start").log("a message")
>   }
> {code}



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

Reply via email to