Hi Claus,

I just test this and indeed this already works better with the latest
3.18.0.

The template is recognized (I do think that most users expect autodiscovery
for route templates btw)

Now I get:

org.apache.camel.component.kamelet.KameletConsumerNotAvailableException: No
consumers available on endpoint: kamelet://sink?routeId=myTemplate-2.
Exchange[CBBC99C88C35310-0000000000000003]
        at
org.apache.camel.component.kamelet.KameletProducer.process(KameletProducer.java:78)
        at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:172)
        at
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:471)
        at
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:189)
        at
org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:61)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:184)
        at
org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:399)
        at
org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:210)
        at
org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:76)
        at java.base/java.util.TimerThread.mainLoop(Timer.java:556)
        at java.base/java.util.TimerThread.run(Timer.java:506)

I think Kamelets assume something like "kamelet:source" or "kamel:sink". I
only use the route template of course:

routeTemplate("myTemplate")
        // here we define the required input parameters (can have
default values)
        .templateParameter("name")
        .templateParameter("greeting")
        .templateParameter("myPeriod", "3s")
        // here comes the route in the template
        // notice how we use {{name}} to refer to the template parameters
        // we can also use {{propertyName}} to refer to property placeholders
        .from("timer:{{name}}?period={{myPeriod}}")
        .setBody(simple("{{greeting}} ${body}"))
        .log("${body}");

Shall I make a Jira for this?

Raymond





On Mon, Jul 25, 2022 at 8:47 AM Claus Ibsen <[email protected]> wrote:

> Hi
>
> You are using a bit old Camel version, try with 3.18.x as route template
> and kamelets keep improving going forward.
>
> The kamelet component will first look in camel content if a route template
> with the given id exists, and use it as-is.
> And if not, then it tries to load it via yaml kamelet files.
>
> So in your use case if you manually load the templates and ensure it is all
> correct then there is a chance that you can "misuse" the kamelet component.
> But use latest version.
>
> On Mon, Jul 25, 2022 at 8:21 AM ski n <[email protected]> wrote:
>
> > OK, thanks (this was more or less what I was trying to avoid :) )
> >
> > I thought that this is possible based on the documentation:
> >
> > https://camel.apache.org/components/next/kamelet-component.html
> >
> > " The Kamelet Component provides support for interacting with the Camel
> > Route Template <https://camel.apache.org/manual/route-template.html>
> > engine
> > using Endpoint semantic. "
> >
> > And later it says:
> >
> > "Configuring components can be done with the Component DSL
> > <https://camel.apache.org/manual/component-dsl.html>, in a configuration
> > file (application.properties|yaml), or directly with Java code."
> >
> > For me, it's not really clear what 'interacting with the Camel Route
> > Template' and 'configuring' means? Why do I need the extra initiation
> step
> > in between?
> > I thought I configure it directly by using it in a route through endpoint
> > semantics?
> >
> > Are there plans to make it possible like I described in the previous post
> > (thus without YAML)? I am already using the Java DSL and XML DSL and I
> > don't want to use the YAML DSL as well.
> >
> > My goal is to define the template through the Java API
> >
> > and
> >
> > then let users write a route and call it to use only endpoint semantic. I
> > do not know what values the user will use (that's why I parameterized
> them)
> > and the user doesn't know anything about templates.
> >
> > I guess I could write a preprocessor, but that's a bit beyond the purpose
> > of avoiding the current preprocessing (I have a web application and get
> the
> > route configuration as JSON and then convert it to an XML route). The
> goal
> > was to make this process easier :)
> >
> > Raymond
> >
> >
> >
> >
> >
> > On Mon, Jul 25, 2022 at 7:37 AM Claus Ibsen <[email protected]>
> wrote:
> >
> > > Hi
> > >
> > > Kamelets and route templates are not 100% the same, so what you do is
> not
> > > possible.
> > >
> > > The kamelet component (eg to("kamelet:xxx") is for kamelets, that are
> > yaml
> > > files with metadata and an embedded route template (flow)
> > > https://github.com/apache/camel-kamelets
> > >
> > > With route templates, you need to use the java api, to add a route
> from a
> > > template, and give it some id, and parameters.
> > > And then from your route that wants to call then use direct:xxx to call
> > the
> > > new route.
> > >
> > >
> > >
> > > On Sun, Jul 24, 2022 at 11:19 PM ski n <[email protected]>
> wrote:
> > >
> > > > Hi,
> > > >
> > > > I have a Camel routeTemplate like this:
> > > >
> > > > public class MyRouteTemplates extends RouteBuilder {
> > > >
> > > >     @Override
> > > >     public void configure() throws Exception {
> > > >         // create a route template with the given name
> > > >         routeTemplate("myTemplate")
> > > >             // here we define the required input parameters (can have
> > > > default values)
> > > >             .templateParameter("name")
> > > >             .templateParameter("greeting")
> > > >             .templateParameter("myPeriod", "3s")
> > > >             // here comes the route in the template
> > > >             // notice how we use {{name}} to refer to the template
> > > > parameters
> > > >             // we can also use {{propertyName}} to refer to property
> > > > placeholders
> > > >             .from("timer:{{name}}?period={{myPeriod}}")
> > > >                 .setBody(simple("{{greeting}} ${body}"))
> > > >                 .log("${body}");
> > > >     }
> > > > }
> > > >
> > > > And I like to call it from a route as a Kamelet like this:
> > > >
> > > > from("direct:a")
> > > >   .to("kamelet:myTemplate?someparameters")
> > > >
> > > > How to make "myTemplate" available to the CamelContext?
> > > >
> > > >
> > > > I saw in camel-examples that is using camel-main that you can do it
> > like
> > > > this:
> > > >
> > > >         Main main = new Main();
> > > >         main.configure().addRoutesBuilder(MyRouteTemplates.class);
> > > >
> > > > However I am not using main, but Camel core. So I tried it like:
> > > >
> > > > MyRouteTemplates myRouteTemplates = new new MyRouteTemplates();
> > > > myRouteTemplates.addRoutesToCamelContext(context);
> > > >
> > > > or
> > > >
> > > > context.addRoutes(myRouteTemplates);
> > > >
> > > >
> > > > However I get
> > > "org.apache.camel.component.kamelet.KameletNotFoundException:
> > > > Kamelet with id myTemplate not found in locations:
> > classpath:/kamelets".
> > > >
> > > > This was using Camel 3.14.4
> > > >
> > > > What is the correct way to register/load routeTemplate so they can
> used
> > > by
> > > > a Kamelet endpoint?
> > > >
> > > > Raymond
> > > >
> > >
> > >
> > > --
> > > Claus Ibsen
> > > -----------------
> > > http://davsclaus.com @davsclaus
> > > Camel in Action 2: https://www.manning.com/ibsen2
> > >
> >
>
>
> --
> Claus Ibsen
> -----------------
> http://davsclaus.com @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2
>

Reply via email to