[ 
https://issues.apache.org/jira/browse/CAMEL-3285?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12977369#action_12977369
 ] 

Ashwin Karpe edited comment on CAMEL-3285 at 1/4/11 12:39 PM:
--------------------------------------------------------------

Hi Kristof, 

We agree on a) and b) and the current implementation clearly follows this. 

In the current implementation of the routebox component, there is only one 
inner context created for a unique endpoint name. The endpoint name is then 
tied uniquely to its innerContext and host multiple inner routes. This should 
meet your requirement relating to encapsulation, hosting and strategy/map based 
payload indirection to inner routes. 

As for point c) in your comment, the URI definition is where the divergence 
with your requirement is indeed present and I am aware of this. 

My design/implementation choices were guided by the following reasoning given 
below 
-------------------------- 
Currently in Camel, Protocols/URI schemes enable binding & registration of a 
specific component known to the Camel Context which is then used as a factory 
to create specialized endpoints of a given type (e.g http, jms etc). The 
protocol/URI scheme mapping to a component registration is done at context 
creation automatically using an API called addComponent(String componentName, 
final Component component) .The only exception is when a routebuilder is used 
to add a component. 
 
Therefore, you will find that when you add a camel component maven dependency 
in your pom file the component is automatically registered under its fixed 
name. This happens via a file which is scanned during context creation and is 
present for every component in 
.../trunk/components/camel-routebox/src/main/resources/META-INF/services/org/apache/camel/component/routebox
 which contains a single entry for its associated component. The name of the 
file (routebox) is wired to the URI scheme and the component associated is 
added to the component list. Following this, camel now has the ability to 
create the requisite endpoints. 

Now coming to the answer you are looking for... The reason James talked about a 
ProtocolBuilder akin to a RouteBuilder was so that this magic of mapping 
"bookstore" to the Routebox component could be performed by the API which the 
user could write code for (or maybe not, based on the design)... This 
addComponent() would need to be done every protocol (bookstore, bookstore1, 
mybookstore etc) you were planning to use. 

Also, since the URI scheme suddenly became cheap, you could add all manner of 
names for components and potentially override the values of well known 
protocols. You could run into name clashes in different ProtocolBuilders trying 
to do the same thing. 

RouteBuilders currently can do the same for you. You can add a line to your 
configure method to do an addComponent("bookstore", RouteComponent") 
----------------------------- 

I decided not to pursue this road since RouteBuilders currently can do the same 
for you and the ProtocolBuilder was in my view over-engineering for little 
gain. You can add a line to your configure method to do an 
addComponent("bookstore", RouteComponent") even now and then do a 
       bookstore:bookstore_routes?... 
                 instead of 
       routebox:bookstore_routes?... 
with an exchange header ROUTE_DISPATCH_KEY=addToCatalog so the payload can be 
indirected to URI seda:addToCatalog. 

BTW, I spoke to James and Claus a few weeks ago in early December about my 
design and implementation strategy. I also rotated this many times in my own 
mind, ran these ideas by an existing customer with similar needs regarding 
pros/cons and arrived at this point. James did think that my design was proper 
(though not how he had envisioned it in the beginning) and asked me to go ahead 
and contribute the code as seen in my current implementation. I also spoke to 
Claus briefly and he was quite happy with the implementation plan. 

I am not saying this is the final form for this component. I am happy to take 
on any thoughts, ideas and/or patches you may have and re-factor the component 
appropriately. 

Sorry about the rather long winded answer. I hope this given you a sense of 
where I am coming from. 
  
Cheers, 

Ashwin... 


      was (Author: akarpe):
    Hi Kristof, 

We agree on a) and b) and the current implementation clearly follows this. 

In the current implementation of the routebox component, there is only one 
inner context created for a unique endpoint name. The endpoint name is then 
tied uniquely to its innerContext and host multiple inner routes. This should 
meet your requirement relating to encapsulation, hosting and strategy/map based 
payload indirection to inner routes. 

As for point c) in your comment, the URI definition is where the divergence 
with your requirement is indeed present and I am aware of this. 

My design/implementation choices were guided by the following reasoning given 
below 
-------------------------- 
Currently in Camel, Protocols/URI schemes enable binding & registration of a 
specific component known to the Camel Context which is then used as a factory 
to create specialized endpoints of a given type (e.g http, jms etc). The 
protocol/URI scheme mapping to a component registration is done at context 
creation automatically using an API called addComponent(String componentName, 
final Component component) .The only exception is when a routebuilder is used 
to add a component. 
 
Therefore, you will find that when you add a camel component maven dependency 
in your pom file the component is automatically registered under its fixed 
name. This happens via a file which is scanned during context creation and is 
present for every component 
trunk/components/camel-routebox/src/main/resources/META-INF/services/org/apache/camel/component/routebox
 which contains a single entry for its associated component. The name of the 
file (routebox) is wired to the URI scheme and the component associated is 
added to the component list. Following this, camel now has the ability to 
create the requisite endpoints. 

Now coming to the answer you are looking for... The reason James talked about a 
ProtocolBuilder akin to a RouteBuilder was so that this magic of mapping 
"bookstore" to the Routebox component could be performed by the API which the 
user could write code for (or maybe not, based on the design)... This 
addComponent() would need to be done every protocol (bookstore, bookstore1, 
mybookstore etc) you were planning to use. 

Also, since the URI scheme suddenly became cheap, you could add all manner of 
names for components and potentially override the values of well known 
protocols. You could run into name clashes in different ProtocolBuilders trying 
to do the same thing. 

RouteBuilders currently can do the same for you. You can add a line to your 
configure method to do an addComponent("bookstore", RouteComponent") 
----------------------------- 

I decided not to pursue this road since RouteBuilders currently can do the same 
for you and the ProtocolBuilder was in my view over-engineering for little 
gain. You can add a line to your configure method to do an 
addComponent("bookstore", RouteComponent") even now and then do a 
       bookstore:bookstore_routes?... 
                 instead of 
       routebox:bookstore_routes?... 
with an exchange header ROUTE_DISPATCH_KEY=addToCatalog so the payload can be 
indirected to URI seda:addToCatalog. 

BTW, I spoke to James and Claus a few weeks ago in early December about my 
design and implementation strategy. I also rotated this many times in my own 
mind, ran these ideas by an existing customer with similar needs regarding 
pros/cons and arrived at this point. James did think that my design was proper 
(though not how he had envisioned it in the beginning) and asked me to go ahead 
and contribute the code as seen in my current implementation. I also spoke to 
Claus briefly and he was quite happy with the implementation plan. 

I am not saying this is the final form for this component. I am happy to take 
on any thoughts, ideas and/or patches you may have and re-factor the component 
appropriately. 

Sorry about the rather long winded answer. I hope this given you a sense of 
where I am coming from. 
  
Cheers, 

Ashwin... 

  
> Create a new blackbox component which can encapsulate routes using a 
> specialized ProtocolBuilder endpoint (similar to RouteBuilder)
> -----------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-3285
>                 URL: https://issues.apache.org/jira/browse/CAMEL-3285
>             Project: Camel
>          Issue Type: New Feature
>            Reporter: Ashwin Karpe
>            Assignee: Ashwin Karpe
>             Fix For: 2.6.0
>
>         Attachments: camel-routebox-20101220.zip, routebox.diff
>
>
> Given below is the discussion forum thread that spawned this thought.
> http://camel.465427.n5.nabble.com/Abstracting-Routes-using-Components-td3234703.html#a3234703
> Component requirements:
>  Need a Camel component (called Backbox, maybe) that can nicely expose a 
> ProtocolBuilder endpoint that does the following
>     a> Instantiate route definitions/route(s) configured in Spring or DSL at 
> startup
>     b> Launch a Producer or Consumer with a well known protocol(s) so that a 
> client can invoke it (could be direct or seda initially but could be any 
> protocol... really) . Must support multiple consumer endpoints and routes 
> using a URI scheme.
>     c> redirect received payloads (with marshalling into an exchange if 
> necessary) to the inner route(s) since they are launched and started. If 
> there are multiple inner routes with many consumers, we could expect the user 
> to provide a clue using the payload and/or an exchange property as to how the 
> payload should be routed.
>     d> Extend from a Default Consumer, Producer, Endpoint and Component.
>     e> Internally manage inner route lifecycles and operations. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to