Hi Claus,

thank for spending your time with my problem ...

I followed your advice and tested the behavior on Camel 2.6.0 latest
snapshot after extracting it out of our internal projects. But behavior
stays unchanged.

And of course I'm loading loading routes from a separate xml file inside of
<routes> tags ... Maybe it would be better to describe it a little in coding
style ...

I'm using Spring to "boot" Camel. So I have a spring-config.xml containing
following camleContext

  <camelContext id ="camel-core" xmlns
="http://camel.apache.org/schema/spring";>   
    <route id="core-route01">
      <from uri="direct:core-route01"/>
      <transacted/>
      <to   uri="mock:core-route01"/>
    </route>        
  </camelContext>

Of course all the stuff to make <transacted/> working are present too and
only let out to shorting this post.
In my testcase I verify that this route is loaded and working

    Assert.assertNotNull( this.context.getRoute( "core-route01" ) );
    Assert.assertEquals ( 1, this.context.getRoutes().size() );
    [....]

Works fine.

Now I'm loading new route from xml file (routeContext-test01.xml)

  <routes xmlns="http://camel.apache.org/schema/spring";>
    <route id="test01-route01">
      <from uri="direct:test01-route01"/>
      <to   uri="mock:test01-route01"/>
    </route> 
  </routes>

with following code

    Resource rs = new ClassPathResource( "routeContext-test01.xml",
this.getClass() );
    RoutesDefinition routes = this.context.loadRoutesDefinition(
rs.getInputStream() );
    this.context.addRouteDefinitions( routes.getRoutes() );

and verifying it again (I don't repeat the code).

Works fine.

Now I'm going to load next xml file (routeContext-test02.xml)

<routes xmlns="http://camel.apache.org/schema/spring";>
  <route id="test02-route01">
    <from uri="direct:test02-route01"/>
    <transacted/>
    <to   uri="mock:test02-route01"/>
  </route> 
</routes>

Only difference to test01 is added <transacted/> tag. And it should be
basically same like the one in camelContext. Of course naming is a little
bit different too but I hope this wouldn't be reason ...

Loading it with code snippet shown above now leads to an exception

org.apache.camel.FailedToCreateRouteException: Failed to create route
test02-route01 at: >>> From[direct:test02-route01] <<< in route:
Route[[From[direct:test02-route01]] -> [Transacted[ref:null]... because of
Route test02-route01 has no output processors. You need to add outputs to
the route such as to("log:foo").
        at
org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:764)
        at
org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:174)
        at
org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:698)
        at
org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:1603)
        at
org.apache.camel.impl.DefaultCamelContext.addRouteDefinitions(DefaultCamelContext.java:649)
        at
com.gk_software.camel.testRouteLoading.TestCase.test01(TestCase.java:104)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:592)
        at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
        at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
        at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
        at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
        at
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
        at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
        at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
        at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
        at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.IllegalArgumentException: Route test02-route01 has no
output processors. You need to add outputs to the route such as
to("log:foo").
        at
org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:762)
        ... 29 more

Reason why a route described (to avoid the word "loading") in camelContext
behaves different than a route loaded from <routes> tags are in my opinion
the post processing happening in
AbstractCamelContextFactoryBean.afterPropertiesSet().

Maybe this bavior is wanted, I don't know. If full "power" of spring dsl for
routes is useable only if they are processed during startup of camelContext
... 

For now it seems real reloading can be done only by restarting complete
camelContext ... 

Still I haven't any idea how do go around - reloading of routes is a needed
key feature for us ...


-----
Bernd Fischer
GK Software AG
[email protected]
-- 
View this message in context: 
http://camel.465427.n5.nabble.com/Loading-routes-from-XML-files-with-Camel-2-4-0-tp3340082p3341319.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to