Thanks for the reply. In summary it works now.
I actually tried this approach before and it didn't work then but now it
works due to minor change. It appears
org.apache.camel.impl.DefaultComponent.createEndpoint(...) doesn't like
numeric name, when I tried earlier I used numeric hash off the IP address.
It ran into following exception, and I assumed the URI schema has to follow
naming convention used in the http://camel.apache.org/uris.html
INFO | jvm 1 | 2010/04/16 18:18:04 | java.net.URISyntaxException:
Illegal character in scheme name at index 0: 1466722955:topic:In.Servers
INFO | jvm 1 | 2010/04/16 18:18:04 | at
java.net.URI$Parser.fail(Unknown Source)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
java.net.URI$Parser.checkChars(Unknown Source)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
java.net.URI$Parser.checkChar(Unknown Source)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
java.net.URI$Parser.parse(Unknown Source)
INFO | jvm 1 | 2010/04/16 18:18:04 | at java.net.URI.<init>(Unknown
Source)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
org.apache.camel.impl.DefaultComponent.createEndpoint(DefaultComponent.java:63)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
com.mycompany.infra.myrouter.MyRouterBean.getRoutes(MyRouterBean.java:73)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
java.lang.reflect.Method.invoke(Unknown Source)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:163)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:92)
INFO | jvm 1 | 2010/04/16 18:18:04 | at
org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:118)
Now by prefixing "activemq" to the hash it works.
Regarding your ProducerCache and RecipientList comment, isn't that a bug?
thanks for the help.
cheers
- mdasari
willem.jiang wrote:
>
> After digging the code, I found why your first "remote server" can
> receive the message.
>
> There is a ProducerCache for the RecipientList and it only take the
> endpoint's uri as the key(in camel the uri is the key of endpoint), and
> all your remote endpoint are with the same uri.
>
> For your case, you need to use CamelContext.addComponent to add the new
> ActiveMQComponent with differnent schema name like
> activemq + [hash of the IP address], then you create the endpoint with
> the name "activemq+[hash of the IP address]:topic:In.LocalServer".
>
> Willem
>
> mdasari wrote:
>> Thanks Willem for your comments. I posted a simpler version of my code.
>> My
>> actual code was adding a camel Component (ActiveMQComponent) by using
>> CamelContext.addComponent and I'm trying to retrieve the component by
>> calling getComponent. The key is hash of the IP address, basically like
>> CamelContext::getOrCreateComponent. At the moment it seems to be creating
>> a
>> new component every time though. I can work around by my own cache or
>> some
>> other means.
>>
>> But my real issue is usage of wrong IP address for delivery of the
>> messages,
>> it must be caching the first Endpoint there some where and using it again
>> and again.
>>
>> I tried with version 1.6.2 there is no change in the behavior. I wonder
>> if
>> there is something wrong with my usage of Endpoint.
>>
>> Are there any other ways of implementing remote broker RecipientList EIP?
>>
>> cheers
>> - mdasari
>>
>>
>>
>> willem.jiang wrote:
>>> You created a new CamelContext and a ActiveMQComponent( for each new
>>> endpoint, that are expensive operation, maybe you can use a
>>> ActiveMQComponent cache with IPAddress as the index.
>>>
>>> Can you try to use the latest released version of Camel 1.x (Camel
>>> 1.6.2) to see if the issue still there?
>>>
>>> Willem
>>>
>>> mdasari wrote:
>>>> Hi,
>>>>
>>>> I needed to route a message from one ActiveMQ broker to one or more
>>>> remote
>>>> ActiveMQ brokers based on some runtime information.
>>>>
>>>> Lets say I've broker "central" and remote brokers "remote1", "remote2",
>>>> ...
>>>> "remoteN".
>>>> The number of remote brokers can change over time and I wouldn't want
>>>> to
>>>> configure any beans or any kind of configuration in the activemq.xml of
>>>> the
>>>> "central" broker.
>>>>
>>>> The following what I tried, but it seems to be sending the message
>>>> always
>>>> to
>>>> the first "remote" server that I used. Couple of points:
>>>>
>>>> 0. I putup a POJO bean with RecipientList EIP.
>>>> 1. topic:Out.RemoteServers is the topic on the "central" broker
>>>> 2. topic:In.LocalServer is the topic on any "remote" broker.
>>>> 3. All applications that post messages to "central" broker add a
>>>> message
>>>> header with name "IPAddesses". The header value contain a list of IP
>>>> addresses corresponding to the "remote" brokers.
>>>> 4. I'm using camel version 1.6.1.0
>>>>
>>>> The code looks as follows (trimmed for clarity)
>>>>
>>>> --------
>>>> @Consume(uri = "topic:Out.RemoteServers")
>>>> @RecipientList()
>>>> public Collection<Endpoint> getRoutes(@Header(name = "IPAddresses")
>>>> String
>>>> ips, String body) {
>>>> List<Endpoint> dests = new ArrayList<Endpoint>();
>>>> try {
>>>> // do some validation on IP addresses header and barf.
>>>>
>>>> // The header is delimited by commas.
>>>> //
>>>> StringTokenizer tokenizer = new StringTokenizer(ips,
>>>> ",");
>>>>
>>>> CamelContext ctx = new DefaultCamelContext();
>>>> while (tokenizer.hasMoreElements()) {
>>>> String ip = tokenizer.nextToken();
>>>> ActiveMQComponent amq = new
>>>> ActiveMQComponent(ctx);
>>>>
>>>> logger.info("Setting the broker URL to IP: " +
>>>> ip);
>>>>
>>>> amq.setBrokerURL("tcp://" + ip + ":61616");
>>>>
>>>> Endpoint ep =
>>>> amq.createEndpoint("activemq:topic:In.LocalServer");
>>>> dests.add(ep);
>>>> }
>>>> } catch (Exception e) {
>>>> // Let our monitoring take care of this..
>>>> logger.error("Unexpected exception while routing.", e);
>>>> }
>>>> return dests;
>>>> }
>>>>
>>>> ----
>>>>
>>>> Appreciate any help.
>>>>
>>>> cheers
>>>> - mdasari
>>>>
>>>
>>>
>>
>
>
>
--
View this message in context:
http://old.nabble.com/How-to-route-a-message-to-remote-ActiveMQ-broker%28s%29-dynamically--tp28273566p28322585.html
Sent from the Camel - Users mailing list archive at Nabble.com.