[
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)