camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Chris Wolf <cwolf.a...@gmail.com>
Subject Re: Camel routing issue
Date Mon, 01 Apr 2013 14:12:44 GMT
Hi Claus,

Thanks for the response - I could not see any obvious way to configure
an FTP Consumer at ***runtime***,
either via bean, processor or consumer template.  If you have a
concrete example, that would be great to see...

...otherwise, here's the solution I came up with:


    -Chris



  // simulate incoming message from JMS...
  from("timer:kickoff?repeatCount=1")
  .to("direct:start");

  // upon receipt of FTP config from JMS, invoke  FtpConfigurer bean
to reconfigure
  // FTP route, then start it...
  from("direct:start")
  .beanRef("configRdr") // config reader bean not shown here
  .convertBodyTo(Document.class)
  // sets a bunch of headers from DOM, e.g.:
  .setHeader("ftp-config.host").xquery("//remote[remoteId/@value='CBOE34']/server/@value",
String.class)
  .setHeader("ftp-route-id", constant("ftp.route"))
  .beanRef("ftpConfigurer");

  // FTP route will only be started by FtpConfigurer bean after it's
dynamically re-configured...
  from("ftp://bogushost/bogusdir?startScheduler=false") // the  URI
will be reconfigured...
  .routeId("ftp.route").noAutoStartup()
  .log("Received file ${file:onlyname}")
  .to("file:/tmp/local/data");

  public class FtpConfigurer {
    public void configureFtpConsumer(Exchange exchange) throws Exception {
        CamelContext context = exchange.getContext();
        Map<String, Object> headers = exchange.getIn().getHeaders();
        Map<String, Object> parameters = new HashMap<String, Object>();

        // Filter headers for ftp-config specific headers...
        for (Map.Entry<String, Object> entry : headers.entrySet()) {
            String key = entry.getKey();
            if (key.startsWith("ftp-config."))
                parameters.put(key.substring("ftp-config.".length()),
entry.getValue());
        }

        String routeId = exchange.getIn().getHeader("ftp-route-id",
String.class);
        Route ftpRoute = context.getRoute(routeId);
        FtpConsumer c = (FtpConsumer) ftpRoute.getConsumer();
        FtpEndpoint<FTPFile> rfe = (FtpEndpoint<FTPFile>) c.getEndpoint();
        FtpConfiguration rfc = rfe.getConfiguration();

        // Need to crack open FtpConsumer's "endpointPath" field since
        // there's no mutator (setter)
        Class<?> cls = c.getClass();
        Field endpointPath_fld = cls.getDeclaredField("endpointPath");
        endpointPath_fld.setAccessible(true);
        endpointPath_fld.set(c, (String)parameters.get("directory"));

        // Need to crack open FtpEndpoint, actually DefaultEndpoint -
the ultimate base class
        // since there's no mutator (setter) for the "endpointUri" field
        cls = rfe.getClass();
        Field endpointUri_fld = null;
        while (endpointUri_fld == null) {
            // TODO: maybe change logic to just stop at class=DefaultEndpoint
            // rather then using NoSuchFieldException
            try {
                endpointUri_fld = cls.getDeclaredField("endpointUri");
            } catch (NoSuchFieldException nsfe) {
                cls = cls.getSuperclass();
            }
        }
        endpointUri_fld.setAccessible(true);
        endpointUri_fld.set(rfe,
            String.format("ftp://%s/%s",
(String)parameters.get("host"), (String)parameters.get("directory")));

        // set reference properties first as they use # syntax that
fools the regular properties setter
        EndpointHelper.setReferenceProperties(context, rfc, parameters);
        EndpointHelper.setProperties(context, rfc, parameters);
        EndpointHelper.setReferenceProperties(context, rfe, parameters);
        EndpointHelper.setProperties(context, rfe, parameters);
        c.setStartScheduler(true);

        context.startRoute(routeId);
  }
}

On Mon, Apr 1, 2013 at 4:32 AM, Claus Ibsen <claus.ibsen@gmail.com> wrote:
> Hi
>
> See this EIP
> http://camel.apache.org/content-enricher.html
>
> About pollEnrich.
>
> Though pollEnrich currently does support dynamic uris. Its on the roadmap,
> for Camel 3.0.
> It requires an API change and thus isn't so easy to implement currently on
> 2.x.
>
> You can always use a java bean / camel processor, and consume the ftp file
> from java code.
> For example using consumer template.
>
> As you use FTP you may want to set disconnect=true so the connect is not
> remained open after usage.
>
>
>
> On Sun, Mar 31, 2013 at 7:51 PM, Chris Wolf <cwolf.algo@gmail.com> wrote:
>
>> Ok, I'm starting to get it - a little bit.  As for my concrete
>> example, so far, I have:
>>
>>                 from("direct:start")
>>                 .beanRef("config")
>>                 .convertBodyTo(Document.class)
>>                 .recipientList().xquery(
>>                     "concat('ftp://'" +
>>                     ",//remote[vendorId/@value='CBOE34']/server/@value" +
>>
>>
>> ",//remote[vendorId/@value='CBOE34']/param[name/@value='directory']/value/@value"
>> +
>>                     ",'?noop=true&amp;username='" +
>>                     ",//remote[vendorId/@value='CBOE34']/username/@value" +
>>                     ",'&amp;password='" +
>>
>> ",//remote[vendorId/@value='CBOE34']/password/@value)", String.class);
>>
>> Here's the problem - this will create an FTP Producer - that's not
>> what I need.  I need a dynamically
>> constructed URI for a polling FTP consumer.  I don't think
>> "recipientList" will work...   Any ideas?
>>
>> Thanks,
>>
>> Chris
>>
>> On Sun, Mar 31, 2013 at 10:27 AM, Chris Wolf <cwolf.algo@gmail.com> wrote:
>> > Hi Claus,
>> >
>> > I hate to ask this - but I still don't get it.  I thought
>> > "recipientList" was for sending to multiple, runtime-defined
>> > recipients.  I don't see how this
>> > answers the question of sending to one, single recipient, whose URI is
>> > dynamically constructed - and in my use-case the dynamic settings
>> > are not in properties - so "simple" (property place-holders) won't help
>> me.
>> >
>> > Let me give you a concrete example.  I need to do an ftp download and
>> > the connection information comes from up-stream in the route in the
>> > form of XML (DOM - a Document instance).  Currently, I am trying to do
>> > this with bean binding and method params decorated with @XPath
>> > pointing into the Document with the ftp settings and inside the
>> > this method doing:
>> >
>> > FtpComponent ftpComponent = context.getComponent("ftp",
>> FtpComponent.class);
>> >
>> > ..and then attempt to get the endpoint and call createConsumer(...).
>> > I'm sure this is not the right way to do it, but I don't see how else
>> > - any ideas?
>> >
>> > Thanks,
>> >
>> >
>> > Chris
>> >
>> > On Sun, Mar 31, 2013 at 2:28 AM, Claus Ibsen <claus.ibsen@gmail.com>
>> wrote:
>> >> Hi
>> >>
>> >> See this FAQ
>> >> http://camel.apache.org/how-do-i-use-dynamic-uri-in-to.html
>> >>
>> >>
>> >>
>> >>
>> >> On Sun, Mar 31, 2013 at 5:22 AM, prabumca06@gmail.com
>> >> <prabumca06@gmail.com>wrote:
>> >>
>> >>> Thanks Walzer..
>> >>> *
>> >>> *
>> >>> *Queston1:
>> >>>
>> >>> *
>> >>> *Example*
>> >>>
>> >>> .when(header("foo").isEqualTo("bar"))
>> >>>                     .to("direct:b")
>> >>>
>> >>> In my case i have to add more than 80 condition and forwards to 80
>> >>> different queues.
>> >>>
>> >>> Above example i can only hard-code queue name,But what i want is below.
>> >>>
>> >>> * .when(header("Type").isNotNull())
>> >>>     .to("activemq.Inbound."+header("Type"))
>> >>> *
>> >>>
>> >>> Example:If queue type is test,It should forward to *Inbound.test*
>> queue.
>> >>>
>> >>> Above example i tried,but it did not worked,created queue something
>> >>> like this *Inbound.header("type")*
>> >>>
>> >>> *Question2*:
>> >>>
>> >>> from("direct:a")
>> >>>             .multicast().to("direct:b", "direct:c", "direct:d");
>> >>>
>> >>> Based on messages header and content type i want forward to different
>> >>> queue.
>> >>>
>> >>> condition will be *OR *and *AND*.How can i do that like above example.*
>> >>> *
>> >>>
>> >>> Thanks in advance*
>> >>> *
>> >>>
>> >>> *Regards*
>> >>>
>> >>> Prabu.N
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>> On Sun, Mar 31, 2013 at 2:43 AM, Walzer, Thomas [via Camel] <
>> >>> ml-node+s465427n5730116h98@n5.nabble.com> wrote:
>> >>>
>> >>> > Hi,
>> >>> >
>> >>> > you could start by reading Claus´ book (p. 44ff) which has a perfect
>> >>> > example or http://camel.apache.org/content-based-router.html (just
>> >>> > replace the direct: with your queues).
>> >>> > If you need to fire your messages to multiple queues:
>> >>> > http://camel.apache.org/publish-subscribe-channel.html shows you
the
>> >>> > various ways.
>> >>> > When you get the concepts you can just "lego" them together.
>> >>> >
>> >>> > Regards, Thomas.
>> >>> >
>> >>> > Am 30.03.2013 um 19:05 schrieb "[hidden email]<
>> >>> http://user/SendEmail.jtp?type=node&node=5730116&i=0>"
>> >>> > <[hidden email] <
>> http://user/SendEmail.jtp?type=node&node=5730116&i=1>>:
>> >>> >
>> >>> > > Hi Claus,
>> >>> > >
>> >>> > > Thanks so much Clus for help.It is working now.
>> >>> > >
>> >>> > > I need your guidance for the following requirement.
>> >>> > >
>> >>> > > 1.I have one *inbound queue* it will receive message frequently
>> from my
>> >>> > > application.
>> >>> > > 2.From *inbound queue* i need camel routing to move message
from
>> >>> > > another *message
>> >>> > > based inbound queue* based on message header value.
>> >>> > > 3.From *message based inbound queue *i* *need camel routing
to move
>> >>> > message
>> >>> > > to *one or more outbound queue *based on message content*
>> >>> > > *
>> >>> > >
>> >>> > > I need *camel java DSL*sample code for above requirement.*
>> >>> > > *
>> >>> > > *
>> >>> > > *
>> >>> > > *Thanks in advance*
>> >>> > >
>> >>> > >
>> >>> > > On Sat, Mar 30, 2013 at 3:10 PM, Claus Ibsen-2 [via Camel]
<
>> >>> > > [hidden email] <
>> http://user/SendEmail.jtp?type=node&node=5730116&i=2>>
>> >>> > wrote:
>> >>> > >
>> >>> > >> Hi
>> >>> > >>
>> >>> > >> Do as the exception tells you. Check route 2. You route
from
>> >>> > >> "Inbound.SSS.TestEvent". And that is now know to Camel.
>> >>> > >>
>> >>> > >> Maybe you need to add "activemq:" as prefix so its
>> >>> > >> "activemq:Inbound.SSS.TestEvent".
>> >>> > >>
>> >>> > >>
>> >>> > >> On Fri, Mar 29, 2013 at 7:01 PM, [hidden email]<
>> >>> > http://user/SendEmail.jtp?type=node&node=5730109&i=0>
>> >>> > >> <[hidden email] <
>> http://user/SendEmail.jtp?type=node&node=5730109&i=1
>> >>> >>
>> >>> >
>> >>> > >> wrote:
>> >>> > >>
>> >>> > >>>
>> >>> > >>> I have activemmq  Project in that i have following
requirement
>> >>> > >>>
>> >>> > >>> 1.Move message from Inbound queue to type based inbound
queue.
>> >>> > >>> 2.Move message from Message type inbound queue to
outbound queue
>> >>> > >>>
>> >>> > >>> I have created two bean for to achieve this.
>> >>> > >>>
>> >>> > >>> 1.one for move from inbound to message type  inbound
queue
>> >>> > >>> 2.one for move from inbound to outbound queue.
>> >>> > >>>
>> >>> > >>> I have following entry in camel.xml
>> >>> > >>>
>> >>> > >>>   <camelContext id="camel" xmlns="
>> >>> > http://camel.apache.org/schema/spring">
>> >>> > >>
>> >>> > >>>
>> >>> > >>>                <routeBuilder ref="routeBuilder"
/>
>> >>> > >>>            <routeBuilder ref="routeBuilder1" />
>> >>> > >>>
>> >>> > >>>    </camelContext>
>> >>> > >>>
>> >>> > >>>    <bean id="routeBuilder"
>> >>> > >>> class="com.camel.routes.SinglecastRouteBuilder"/>
>> >>> > >>>    <bean id="recipientsGenerator"
>> >>> > >>> class="com.camel.routes.TypeSpecificListBean"/>
>> >>> > >>>    <bean id="routeBuilder1"
>> >>> > >>> class="com.camel.routes.MulticastRouteBuilder"/>
>> >>> > >>>    <bean id="recipientsGenerator1"
>> >>> > >>> class="com.camel.routes.RecipientListBean"/>
>> >>> > >>>
>> >>> > >>> When i run application i am getting following error.
>> >>> > >>>
>> >>> > >>> * java.lang.Exception: org.apache.camel.RuntimeCamelException:
>> >>> > >>> org.apache.camel.Fa
>> >>> > >>> iledToCreateRouteException: Failed to create route
route2:
>> >>> > >>> Route[[From[Inbound.G
>> >>> > >>> MD.TestEvent]] -> [Multicast[[Bean[ref:... because
of No endpoint
>> >>> > could
>> >>> > >> be
>> >>> > >>> found
>> >>> > >>> for: Inbound.SSS.TestEvent, please check your classpath
contains
>> the
>> >>> > >> needed
>> >>> > >>> Cam
>> >>> > >>> el component jar.*
>> >>> > >>>
>> >>> > >>> I am not sure i am missing any configuration,Please
kindly help
>> me
>> >>> > >>>
>> >>> > >>>
>> >>> > >>>
>> >>> > >>>
>> >>> > >>> --
>> >>> > >>> View this message in context:
>> >>> > >>
>> http://camel.465427.n5.nabble.com/Camel-routing-issue-tp5730094.html
>> >>> > >>> Sent from the Camel - Users mailing list archive at
Nabble.com.
>> >>> > >>
>> >>> > >>
>> >>> > >>
>> >>> > >> --
>> >>> > >> Claus Ibsen
>> >>> > >> -----------------
>> >>> > >> Red Hat, Inc.
>> >>> > >> FuseSource is now part of Red Hat
>> >>> > >> Email: [hidden email]<
>> >>> > http://user/SendEmail.jtp?type=node&node=5730109&i=2>
>> >>> > >> Web: http://fusesource.com
>> >>> > >> Twitter: davsclaus
>> >>> > >> Blog: http://davsclaus.com
>> >>> > >> Author of Camel in Action: http://www.manning.com/ibsen
>> >>> > >>
>> >>> > >>
>> >>> > >> ------------------------------
>> >>> > >> If you reply to this email, your message will be added
to the
>> >>> > discussion
>> >>> > >> below:
>> >>> > >>
>> >>> > >>
>> >>> >
>> >>> > >> .
>> >>> > >> NAML<
>> >>> >
>> >>>
>> http://camel.465427.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml
>> >>> >
>> >>> >
>> >>> > >>
>> >>> > >
>> >>> > >
>> >>> > >
>> >>> > > --
>> >>> > > Thanks & Regards
>> >>> > > Prabu.N
>> >>> > >
>> >>> > >
>> >>> > >
>> >>> > >
>> >>> > > --
>> >>> > > View this message in context:
>> >>> >
>> >>>
>> http://camel.465427.n5.nabble.com/Camel-routing-issue-tp5730094p5730115.html
>> >>> >
>> >>> > > Sent from the Camel - Users mailing list archive at Nabble.com.
>> >>> >
>> >>> >
>> >>> >
>> >>> > ------------------------------
>> >>> >  If you reply to this email, your message will be added to the
>> discussion
>> >>> > below:
>> >>> >
>> >>> >
>> >>>
>> http://camel.465427.n5.nabble.com/Camel-routing-issue-tp5730094p5730116.html
>> >>> >  To unsubscribe from Camel routing issue, click here<
>> >>>
>> http://camel.465427.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=5730094&code=cHJhYnVtY2EwNkBnbWFpbC5jb218NTczMDA5NHw4OTY0MTU3ODg=
>> >>> >
>> >>> > .
>> >>> > NAML<
>> >>>
>> http://camel.465427.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml
>> >>> >
>> >>> >
>> >>>
>> >>>
>> >>>
>> >>> --
>> >>> Thanks & Regards
>> >>>  Prabu.N
>> >>>
>> >>>
>> >>>
>> >>>
>> >>> --
>> >>> View this message in context:
>> >>>
>> http://camel.465427.n5.nabble.com/Camel-routing-issue-tp5730094p5730118.html
>> >>> Sent from the Camel - Users mailing list archive at Nabble.com.
>> >>>
>> >>
>> >>
>> >>
>> >> --
>> >> Claus Ibsen
>> >> -----------------
>> >> Red Hat, Inc.
>> >> FuseSource is now part of Red Hat
>> >> Email: cibsen@redhat.com
>> >> Web: http://fusesource.com
>> >> Twitter: davsclaus
>> >> Blog: http://davsclaus.com
>> >> Author of Camel in Action: http://www.manning.com/ibsen
>>
>
>
>
> --
> Claus Ibsen
> -----------------
> Red Hat, Inc.
> FuseSource is now part of Red Hat
> Email: cibsen@redhat.com
> Web: http://fusesource.com
> Twitter: davsclaus
> Blog: http://davsclaus.com
> Author of Camel in Action: http://www.manning.com/ibsen

Mime
View raw message