I also created an issue for this with an example:
https://issues.apache.org/jira/browse/CAMEL-17953


On Wed, Apr 13, 2022 at 9:25 AM ski n <raymondmees...@gmail.com> wrote:

> Yes, based on the link Claus send:
>
> https://camel.apache.org/manual/route-configuration.html
>
> There is an example of how to do it in Java and how to add it to the
> CamelContext. There is also an example of how to do it with XML:
>
> <routeConfiguration id="xmlError">
>     <onException>
>         <exception>java.lang.Exception</exception>
>         <handled><constant>true</constant></handled>
>         <log message="XML WARN: ${exception.message}"/>
>     </onException></routeConfiguration>
>
>
> But there is nothing about how to add this to the CamelContext. I assumed
> I need to do this through the RoutesLoader (the same as a normal route).
> Note I add routes as String to the RoutesLoader. However this doesn't seem
> to work.
>
> Raymond
>
>
>
> On Tue, Apr 12, 2022 at 11:38 PM Chirag <chirag.sangh...@gmail.com> wrote:
>
>> Raymond,
>>
>> to summarise:
>> You want to load route configuration using XML?
>>
>> ચિરાગ/चिराग/Chirag
>> ------------------------------------------
>> Sent from My Gmail Account
>>
>> On Tue, Apr 12, 2022 at 7:59 AM ski n <raymondmees...@gmail.com> wrote:
>> >
>> > Loading the routeconfiguration through:
>> >
>> > loader.loadRoutes(resource);
>> >
>> > also doesn't work. Directly from Java is no problem. Is this a bug or
>> > should the XML RouteConfiguration loaded differently?
>> >
>> > Raymond
>> >
>> > On Mon, Apr 11, 2022 at 10:26 PM ski n <raymondmees...@gmail.com>
>> wrote:
>> >
>> > > As a note:
>> > >
>> > > When when using the routeConfiguration from Java and load it:
>> > >
>> > > public class MyJavaErrorHandler extends RouteConfigurationBuilder {
>> > >
>> > >     @Override
>> > >     public void configuration() throws Exception {
>> > >         routeConfiguration("xmlError")
>> > >             .onException(Exception.class).handled(true)
>> > >             .log("Java WARN: ${exception.message}");
>> > >     }
>> > > }
>> > >
>> > > context.addRoutes(new MyJavaErrorHandler());
>> > >
>> > > then it works as expected. Thus, it must be because of the way the
>> > > routeconfiguration was loaded. I loaded it using:
>> > >
>> > > loader.updateRoutes(resource);
>> > >
>> > > I assumed it worked similar to the old "addOrUpdateXml" method as it
>> says
>> > >
>> > > "Loads or updates existing RoutesBuilder". However it works
>> differently
>> > > (at least for RouteConfiguration). When changing the
>> > > routeConfiguration to:
>> > >
>> > > loader.loadRoutes(resource);
>> > >
>> > > then it worked.
>> > >
>> > > Raymond
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > On Mon, Apr 11, 2022 at 9:13 PM ski n <raymondmees...@gmail.com>
>> wrote:
>> > >
>> > >> Yes, with the try-catch-finally clause one can have more
>> fine-grained.
>> > >> However, I am not the one who writes the routes. I am only loading
>> them.
>> > >> That's why I need a more generic behavior (errorHandler) with some
>> > >> configuration options (routeConfiguration).
>> > >>
>> > >> I assumed that the XML routeConfiguration can be loaded the same as a
>> > >> 'normal' xml route. I loaded the following:
>> > >>
>> > >> <routeConfiguration id="xmlError">
>> > >>     <onException>
>> > >>         <exception>java.lang.Exception</exception>
>> > >>         <handled><constant>true</constant></handled>
>> > >>         <log message="XML WARN: ${exception.message}"/>
>> > >>     </onException></routeConfiguration>
>> > >>
>> > >> And then the route:
>> > >>
>> > >> <route routeConfigurationId="xmlError">
>> > >>     <from uri="timer:xml?period=5s"/>
>> > >>     <log message="I am XML"/>
>> > >>     <throwException exceptionType="java.lang.Exception"
>> message="Some kind of XML error"/></route>
>> > >>
>> > >>
>> > >> I see the error thrown "Some kind of XML error", but I don't see it
>> > >> handled (for example the XML WARN message). Is there something that
>> I am
>> > >> missing?
>> > >>
>> > >> Raymond
>> > >>
>> > >>
>> > >>
>> > >>
>> > >>
>> > >> On Mon, Apr 11, 2022 at 6:06 PM Chirag <chirag.sangh...@gmail.com>
>> wrote:
>> > >>
>> > >>> You could wrap it using try/catch.
>> > >>>
>> > >>> See:  https://camel.apache.org/manual/try-catch-finally.html
>> > >>>
>> > >>> My experience with it is - it depends on the endpoint involved to
>> > >>> throw exceptions and enter doCatch appropriately.
>> > >>>
>> > >>> ચિરાગ/चिराग/Chirag
>> > >>> ------------------------------------------
>> > >>> Sent from My Gmail Account
>> > >>>
>> > >>> On Mon, Apr 11, 2022 at 11:10 AM Claus Ibsen <claus.ib...@gmail.com
>> >
>> > >>> wrote:
>> > >>> >
>> > >>> > Hi
>> > >>> >
>> > >>> > See routes configuration
>> > >>> > https://camel.apache.org/manual/route-configuration.html
>> > >>> >
>> > >>> > On Mon, Apr 11, 2022 at 4:30 PM ski n <raymondmees...@gmail.com>
>> > >>> wrote:
>> > >>> > >
>> > >>> > > I am indeed using Camel 3 (Currently 3.14.2) and using Maven. I
>> just
>> > >>> use
>> > >>> > > plain Java (camel core), so I have a similar setup as your
>> example
>> > >>> (only
>> > >>> > > I'm using Java, instead of the application.properties to
>> configure
>> > >>> the
>> > >>> > > Camel context and its routes). Your example helped me to also
>> use
>> > >>> the Yaml
>> > >>> > > dsl.
>> > >>> > >
>> > >>> > > I am still wondering how to do proper errorHandling/onException
>> with
>> > >>> the
>> > >>> > > routesloader.
>> > >>> > >
>> > >>> > > I can set for example the errorHandler globally:
>> > >>> > >
>> > >>> > > extendedCamelContext.setErrorHandlerFactory(routeErrorHandler);
>> > >>> > >
>> > >>> > > But I rather set it per route / per exception (and best of all
>> from
>> > >>> the
>> > >>> > > xml/yaml files). Like it used to be done like this:
>> > >>> > >
>> > >>> > >   <camelContext id="myCamelContext" xmlns="
>> > >>> > > http://camel.apache.org/schema/spring";>
>> > >>> > >     <!-- Catch the authorization exception and set the Access
>> Denied
>> > >>> > > message back -->
>> > >>> > >     <onException>
>> > >>> > >
>> > >>>  <exception>org.apache.camel.CamelAuthorizationException</exception>
>> > >>> > >       <handled>
>> > >>> > >         <constant>true</constant>
>> > >>> > >       </handled>
>> > >>> > >       <transform>
>> > >>> > >         <simple>Access Denied with the Policy of
>> > >>> ${exception.policyId}
>> > >>> > > !</simple>
>> > >>> > >       </transform>
>> > >>> > >     </onException>
>> > >>> > >
>> > >>> > >     <route>
>> > >>> > >       <from uri="servlet:user"/>
>> > >>> > >       <!-- wrap the route in the policy which enforces security
>> > >>> check -->
>> > >>> > >       <policy ref="user">
>> > >>> > >         <transform>
>> > >>> > >           <simple>Normal user can access this service</simple>
>> > >>> > >         </transform>
>> > >>> > >       </policy>
>> > >>> > >     </route>
>> > >>> > >
>> > >>> > >     <route>
>> > >>> > >       <from uri="servlet:admin"/>
>> > >>> > >       <!-- wrap the route in the policy which enforces security
>> > >>> check -->
>> > >>> > >       <policy ref="admin">
>> > >>> > >         <transform>
>> > >>> > >           <simple>Call the admin operation OK</simple>
>> > >>> > >         </transform>
>> > >>> > >       </policy>
>> > >>> > >     </route>
>> > >>> > >
>> > >>> > >   </camelContext>
>> > >>> > >
>> > >>> > > But such files are not accepted by the routesLoader.
>> > >>> > >
>> > >>> > > I also tried setting the error handler on a specific route from
>> Java
>> > >>> like
>> > >>> > > this:
>> > >>> > >
>> > >>> > > Route route = context.getRoute(myRouteId);
>> > >>> > > route.setErrorHandlerFactory(routeErrorHandler);
>> > >>> > >
>> > >>> > > But that didn't change anything.
>> > >>> > >
>> > >>> > > Raymond
>> > >>> > >
>> > >>> > >
>> > >>> > >
>> > >>> > >
>> > >>> > >
>> > >>> > >
>> > >>> > >
>> > >>> > > On Mon, Apr 11, 2022 at 3:36 PM Chirag <
>> chirag.sangh...@gmail.com>
>> > >>> wrote:
>> > >>> > >
>> > >>> > > > Hello Raymond,
>> > >>> > > >
>> > >>> > > > Are you trying to use Camel 3 ?
>> > >>> > > > Would you use Maven or Gradle to build?
>> > >>> > > >
>> > >>> > > > Here is an example:
>> > >>> > > >
>> > >>>
>> https://github.com/chiragsanghavi/camel-experiments/tree/main/processor
>> > >>> > > > if this helps.
>> > >>> > > >
>> > >>> > > > This example was built to demonstrate a bug- but if you update
>> > >>> maven
>> > >>> > > > to use camel 3.1.5 - it should work.
>> > >>> > > > Only thing needed to support YAML is a change in pom.xml to
>> include
>> > >>> > > > yaml dsl and create yaml files and put them into "routes"
>> folder.
>> > >>> > > >
>> > >>> > > > <dependency>
>> > >>> > > > <groupId>org.apache.camel</groupId>
>> > >>> > > > <artifactId>camel-yaml-dsl</artifactId>
>> > >>> > > > </dependency>
>> > >>> > > >
>> > >>> > > >
>> > >>> > > >
>> > >>> > > > ચિરાગ/चिराग/Chirag
>> > >>> > > > ------------------------------------------
>> > >>> > > > Sent from My Gmail Account
>> > >>> > > >
>> > >>> > > > On Mon, Apr 11, 2022 at 6:15 AM ski n <
>> raymondmees...@gmail.com>
>> > >>> wrote:
>> > >>> > > > >
>> > >>> > > > > Hi All,
>> > >>> > > > >
>> > >>> > > > > I like to use the routesLoader (
>> > >>> > > > >
>> > >>> > > >
>> > >>>
>> https://javadoc.io/static/org.apache.camel/camel-api/3.16.0/org/apache/camel/spi/annotations/RoutesLoader.html
>> > >>> > > > > ).
>> > >>> > > > > I have some questions about how to properly use it.
>> > >>> > > > >
>> > >>> > > > > 1) Is there any documentation on how to use it? (At
>> > >>> > > > > https://camel.apache.org/manual/ or
>> > >>> > > > > https://camel.apache.org/components/next/index.html).
>> > >>> > > > >
>> > >>> > > > > 2) I could find some examples (
>> > >>> https://github.com/apache/camel-examples
>> > >>> > > > ),
>> > >>> > > > > there the routesloader example says:
>> > >>> > > > >
>> > >>> > > > > <!--
>> > >>> > > > >     if you want to have multiple routes, you can either have
>> > >>> multiple
>> > >>> > > > files
>> > >>> > > > > with 1 <route> per file or
>> > >>> > > > >     you can use <routes> as root tag, such as
>> > >>> > > > > <routes><route>...</route><route>...</route></routes>
>> > >>> > > > > -->
>> > >>> > > > >
>> > >>> > > > > <route>
>> > >>> > > > >     <from uri="timer:xml?period=5s"/>
>> > >>> > > > >     <log message="I am XML"/>
>> > >>> > > > > </route>
>> > >>> > > > >
>> > >>> > > > > These examples loads xml, can it also loads other DSL's?
>> (Like
>> > >>> yaml or
>> > >>> > > > > Java).
>> > >>> > > > >
>> > >>> > > > > 3) How to use OnException with the RouteLoader?
>> > >>> > > > >
>> > >>> > > > > I thought maybe like this
>> > >>> > > > >
>> > >>> > > > > <routes xmlns="http://camel.apache.org/schema/spring";>
>> > >>> > > > > <onException>
>> > >>> > > > >  <exception>java.lang.Exception</exception>
>> > >>> > > > >  <redeliveryPolicy maximumRedeliveries="0"
>> > >>> redeliveryDelay="5000"/>
>> > >>> > > > >  <handled><constant>true</constant></handled>
>> > >>> > > > >  <toD uri="file://some/directory"/>
>> > >>> > > > > </onException>
>> > >>> > > > > <route>
>> > >>> > > > > <from uri="timer:xml?period=5s"/>
>> > >>> > > > > <log message="I am XML"/>
>> > >>> > > > > </route>
>> > >>> > > > > </routes>
>> > >>> > > > >
>> > >>> > > > > But this gave me a nullpointer exception.
>> > >>> > > > >
>> > >>> > > > > 4) Load from string directly
>> > >>> > > > >
>> > >>> > > > > In Camel 2 you could load routes directly from string like
>> this:
>> > >>> > > > >
>> > >>> > > > > ManagedCamelContext managed =
>> > >>> > > > > context.getExtension(ManagedCamelContext.class);
>> > >>> > > > > managedContext = managed.getManagedCamelContext();
>> > >>> > > > > managedContext.addOrUpdateRoutesFromXml(routeAsString);
>> > >>> > > > >
>> > >>> > > > > In Camel 3 the "addOrUpdateRoutesFromXml" is depracated.
>> With
>> > >>> routeLoader
>> > >>> > > > > from string I do it like this:
>> > >>> > > > >
>> > >>> > > > > ExtendedCamelContext extendedCamelContext =
>> > >>> > > > > context.adapt(ExtendedCamelContext.class);
>> > >>> > > > > RoutesLoader loader =
>> extendedCamelContext.getRoutesLoader();
>> > >>> > > > > Resource resource = ResourceHelper.fromString("any.xml",
>> route);
>> > >>> > > > >
>> > >>> > > > > loader.updateRoutes(resource);
>> > >>> > > > >
>> > >>> > > > > Is this the only way in Camel 3, or is there also a specific
>> > >>> method to
>> > >>> > > > use
>> > >>> > > > > strings directly (and maybe only specify the DSL used) like:
>> > >>> > > > >
>> > >>> > > > > loader.updateRoutes(routeAsString, "xml");
>> > >>> > > > >
>> > >>> > > > >
>> > >>> > > > > Raymond
>> > >>> > > >
>> > >>> >
>> > >>> >
>> > >>> >
>> > >>> > --
>> > >>> > Claus Ibsen
>> > >>> > -----------------
>> > >>> > http://davsclaus.com @davsclaus
>> > >>> > Camel in Action 2: https://www.manning.com/ibsen2
>> > >>>
>> > >>
>>
>

Reply via email to