[
https://issues.apache.org/jira/browse/CAMEL-3563?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12984710#action_12984710
]
james strachan commented on CAMEL-3563:
---------------------------------------
@Hadrian
Right now any bean in the Spring context which is convertable to a Component or
Endpoint can be used directly in Camel, making a new URI scheme on the fly.
This has been there for 3 years and is a great feature. This is how you can do
things like:
{code}
<bean id="mqSeries" class="org.apache.camel.jms.JmsComponent">
...
<bean id="tibco" class="org.apache.camel.jms.JmsComponent">
...
{code}
So you can take a generic component (JMS) and make specific configured
instances; which then act like a separate URI scheme.
Then in code you can refer to **mqSeries:SomeQueue** and **tibco:AnotherQueue**
Are you proposing we go back in time 3 years and avoid doing such a thing
because you could possibly hide one of the standard URI schemes? Hiding URI
schemes is another great feature - it lets you stub out middleware in test
cases with mock endpoints by just adding beans to your context but reusing a
route definition as is.
So for this specific issue, I'm proposing we add a CamelContextComponent which
takes a CamelContext in the constructor which just exposes its endpoints. Then
any endpoint can be prefixed by the ID of the camelContext in which its defined
and hey presto - in a nice neat URI naming scheme - we get an easy way to route
between CamelContext instances.
I'm not suggesting making any changes to how Camel URIs work (they've been
great for years).
If you really want an explicit URI prefix to make URIs extra long and verbose,
we could also add a "camelContext:" URI scheme which just takes the next name
on the path and looks up the CamelContext in the Spring context and then uses
the same CamelContextComponent I mention above.
In this case both: "camelContext:foo:direct:bar" and "foo:direct:bar" would
work.
Though the genie was let out of the bottle 3 years ago with respect to being
able to hide the default URI scheme implementations. Overriding the mapping of
URI scheme name to an implementation is actually a good thing
> CamelContext should act like a Component (i.e. a TypeConverter of
> CamelContext -> CamelContextComponent)
> --------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-3563
> URL: https://issues.apache.org/jira/browse/CAMEL-3563
> Project: Camel
> Issue Type: Improvement
> Components: camel-core
> Reporter: james strachan
> Fix For: 2.6.0
>
>
> Imagine you have a camelContext.xml for production use (e.g. you're creating
> an OSGi bundle with a camelContext.xml) but you want to create an integration
> test case that tests out your route.
> So you want to create a new Camel XML file, testCamel.xml which includes the
> camelContext.xml and interacts with it. You now have 2 camelContexts. The
> test route needs to be able to refer to any endpoints inside the other
> camelContext.xml.
> CamelContext has an ID (by default camelContext IIRC).
> so if we have
> camelContext.xml
> {code}
> <camelContext id="prod" ...>
> <route>
> <from uri="direct:foo">
> ...
> {code}
> testCamelContext.xml
> {code}
> <camelContext id="test" ...>
> <route>
> <from uri="direct:start">
> <to uri="prod:direct:foo"/>
> </route>
> <route>
> <from uri="prod:seda:bar">
> <to uri="mock:results"/>
> </route>
> {code}
> i.e. in the test case we are routing from our local CamelContext into the
> production camel context's "direct:start" endpoint and consuming from its
> "seda:bar" endpoint.
> i.e. we use "prod" as a name, look it up in the IoC context (just like any
> other Component), but if its a CamelContext we (via TypeConverters) turn it
> into a Component that resolves the rest of the name
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.