[ 
https://issues.apache.org/jira/browse/CAMEL-16394?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Luca Burgazzoli updated CAMEL-16394:
------------------------------------
    Description: 
Now that we have route templates and kamelets, we should explore the option to 
have route local beans in addition to route local properties. This would be 
very useful when dealing with EIPs or endpoints that require specific beans.

As example, assuming I have the following template:

{code:java}
routeTemplate()
  .from("direct:start")
  .to("aws2-s3:...?amazonS3Client=#myClient")
{code}

Then myClient need to be created at global scope and there's no way to create 
one that is specific for the template.

We should provide something like:

{code:java}
routeTemplate()
    .templateParameter("region")
    .templateParameter("bucket")
    .configure((RouteTemplateContext context) -> { 
        // the lambda mechanism here is used as illustration
        // purpose to stress the fact that the materialization
        // of beans should be delayed till the route is reified
        context.bind(
            "myClient", 
            S3Client.builder()
                .region(context.getProperty("region"))
                .build()
        );
    })
    .from("direct:start")
    .to("aws2-s3:{{bucket}}?amazonS3Client=#myClient")
{code}

So when the route is materialized, the configure method is invoked, the 
myClient bean is registered to the current template context and retrieved by 
the reifier to materialize the route.



  was:
Now that we have route templates and kamelets, we should explore the option to 
have route local beans in addition to route local properties. This would be 
very useful when dealing with EIPs or endpoints that require specific beans.

As example, assuming I have the following template:

{code:java}
routeTemplate()
  .from("direct:start")
  .to("aws2-s3:...?amazonS3Client=#myClient")
{code}

Then myClient need to be created at global scope and there's no way to create 
one that is specific for the template.

We should provide something like:

{code:java}
routeTemplate()
    .templateParameter("region")
    .templateParameter("bucket")
    .configure((RouteTemplateContext context) -> { 
        context.bind(
            "myClient", 
            S3Client.builder()
                .region(context.getProperty("region"))
                .build()
        );
    })
    .from("direct:start")
    .to("aws2-s3:{{bucket}}?amazonS3Client=#myClient")
{code}

So when the route is materialized, the configure method is invoked, the 
myClient bean is registered to the current template context and retrieved by 
the reifier to materialize the route.




> Route Template local beans 
> ---------------------------
>
>                 Key: CAMEL-16394
>                 URL: https://issues.apache.org/jira/browse/CAMEL-16394
>             Project: Camel
>          Issue Type: New Feature
>          Components: camel-core
>            Reporter: Luca Burgazzoli
>            Priority: Major
>             Fix For: 3.x
>
>
> Now that we have route templates and kamelets, we should explore the option 
> to have route local beans in addition to route local properties. This would 
> be very useful when dealing with EIPs or endpoints that require specific 
> beans.
> As example, assuming I have the following template:
> {code:java}
> routeTemplate()
>   .from("direct:start")
>   .to("aws2-s3:...?amazonS3Client=#myClient")
> {code}
> Then myClient need to be created at global scope and there's no way to create 
> one that is specific for the template.
> We should provide something like:
> {code:java}
> routeTemplate()
>     .templateParameter("region")
>     .templateParameter("bucket")
>     .configure((RouteTemplateContext context) -> { 
>         // the lambda mechanism here is used as illustration
>         // purpose to stress the fact that the materialization
>         // of beans should be delayed till the route is reified
>         context.bind(
>             "myClient", 
>             S3Client.builder()
>                 .region(context.getProperty("region"))
>                 .build()
>         );
>     })
>     .from("direct:start")
>     .to("aws2-s3:{{bucket}}?amazonS3Client=#myClient")
> {code}
> So when the route is materialized, the configure method is invoked, the 
> myClient bean is registered to the current template context and retrieved by 
> the reifier to materialize the route.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to