Ok, I spoke too soon.  I saw that the RecipientListProcessor has no trouble
with the Expression, and that means that I did not need the pipeline.  So,
instead wrapping the expression evaluator and recipient list in a pipeline,
I skip that, and just return the Recipient List and it works as expected.

On Sun, Dec 3, 2023 at 8:42 AM Steve973 <steve...@gmail.com> wrote:

> Hi, Claus.  You make a good point.  I am setting up a helper class that
> contains the code to create the RecipientList.  I copied over everything
> from the RecipientListReifier class, and converted the places that use the
> Definition instances to just use my Configuration.  I also removed the line
> that wraps the EvaluateExpressionProcessor in an error handler to avoid
> needing a Route instance.  I am encountering an issue (that I was also
> encountering when using the Reifier and the simple Route).  It is reporting
> this error: Cannot invoke
> "org.apache.camel.processor.PooledExchangeTaskFactory.acquire(org.apache.camel.Exchange,
> org.apache.camel.AsyncCallback)" because "this.taskFactory" is null.  In
> the configuration, I am specifying that this should be synchronous, anyway,
> so I am having a bit of a tough time figuring out why this is happening,
> and how to fix it.  Any thoughts?
>
> On Sun, Dec 3, 2023 at 6:19 AM Claus Ibsen <claus.ib...@gmail.com> wrote:
>
>> On Wed, Nov 29, 2023 at 9:06 PM Steve973 <steve...@gmail.com> wrote:
>>
>> > Hi, Claus.  Thanks for the recommendation.  Originally, I was going to
>> use
>> > the RecipientList class and create an instance.  I thought that I would
>> see
>> > how core was creating the processor, which led me to my interest in the
>> > reifier class.  When I looked at it, I saw the value in how it set up
>> the
>> > executors/thread pools, and the aggregation strategy.  If I cannot (or
>> do
>> > not) use the reifier, then I will have to duplicate or re-create that
>> > code.  Since a major point in my refactoring endeavor is to simplify
>> this
>> > component, I am hesitant to do that.
>> >
>> > I am looking at an alternative, and I would like your opinion when you
>> have
>> > the time to offer your thoughts.  I have a route template like this:
>> >
>> > routeTemplate("recipientListRouteTemplate")
>> >         .templateParameter("channel")
>> >         .from("direct:${channel}")
>> >         .process("${channel}RecipientList");
>> >
>> > Then I create a route from this in my DynamicRouterProcessor class like
>> > this:
>> >
>> > String routeId = TemplatedRouteBuilder.builder(camelContext,
>> > "recipientListRouteTemplate")
>> >         .parameter("channel", configuration.getChannel())
>> >         .add();
>> > Route route = camelContext.getRoute(routeId);
>> >
>> > After that, I have code that translates the configuration params into a
>> > RecipientListDefinition.  After that, I have:
>> >
>> > RecipientListReifier reifier = new RecipientListReifier(route,
>> definition);
>> > camelContext.getRegistry()
>> >         .bind(configuration.getChannel() + "RecipientList",
>> > reifier.createProcessor());
>> >
>> > When a message comes in for the DynamicRouterProcessor instance to
>> handle,
>> > the process method handles the exchange like this:
>> >
>> > prepareExchange(exchange);
>> > try (Producer producer = exchange.getContext().getEndpoint("direct:" +
>> > channel).createProducer()) {
>> >     producer.process(exchange);
>> > }
>> >
>> > That was as far as I got yesterday in my implementation, so I was not
>> yet
>> > able to test it.  Is this a terrible idea, or do you think it is worth
>> > trying?  Otherwise, if it's the best option, I could "borrow" the
>> pertinent
>> > code in the reifier and create the RecipientList instance directly.
>> >
>> >
>> Hi
>>
>> I think this seems to complicated and also caused a lot of routes to be
>> added dynamically based on channel names.
>> And that is overhead as the route would then just be a from -> to.
>>
>>
>>
>>
>>
>> > Thanks,
>> > Steve
>> >
>> >
>> >
>> > On Wed, Nov 29, 2023 at 1:19 AM Claus Ibsen <claus.ib...@gmail.com>
>> wrote:
>> >
>> > > Hi
>> > >
>> > > If you need to create the RecipientListProcessor then you dont
>> > > necessary have to use reifier to do it.
>> > >
>> > > We have a few EIPs that are created via annotations
>> > >
>> > >
>> >
>> https://github.com/apache/camel/blob/5235319d94fbb82f479ca3085b0780c0f144111b/core/camel-api/src/main/java/org/apache/camel/spi/AnnotationBasedProcessorFactory.java#L44
>> > >
>> > > You can just create the processor yourself and configure it
>> accordingly.
>> > >
>> > >
>> > >
>> > >
>> > > On Tue, Nov 28, 2023 at 12:51 AM Steve973 <steve...@gmail.com> wrote:
>> > >
>> > > > Hello.  I am attempting to simplify my Dynamic Router EIP component
>> by
>> > > > using the existing RecipientList implementation from camel-core.
>> > > >
>> > > > I was looking at the RecipientListReifier, even though I will not be
>> > > adding
>> > > > anything to the Camel DSL.  It looks like it would be perfect for
>> > setting
>> > > > up the RecipientList instance.  I can take my configuration class,
>> and
>> > > > adapt it to a RecipientListDefinition instance.  The problem that I
>> am
>> > > > encountering is that the RecipientListReifier constructor wants a
>> Route
>> > > > instance.  When routing recipients send their subscription
>> information
>> > to
>> > > > the dynamic router component through its control channel, this is
>> not
>> > the
>> > > > route that the actual routing will occur on.  So I have no idea what
>> > > Route
>> > > > instance I can provide to the Reifier constructor.  Furthermore,
>> when
>> > the
>> > > > dynamic router receives a message, the producer simply calls the
>> > > processor,
>> > > > so there is no real route to speak of, even during runtime dynamic
>> > > routing.
>> > > >
>> > > > My questions are:
>> > > >
>> > > > 1. Is this a decent approach?  After a recent code review, it
>> occurred
>> > to
>> > > > me that I needed to simplify everything, and this would do that.
>> The
>> > > > component would only need to manage subscriptions, and evaluate
>> > exchanges
>> > > > for recipients.
>> > > >
>> > > > 2. What should I use as the Route instance for the Reifier
>> constructor?
>> > > > Would it be a good idea to create a RouteBuilder for each dynamic
>> > routing
>> > > > channel that subscribers are using?  It would go from
>> > > "direct:channelName"
>> > > > and then to the processor.  That still leaves me confused about how
>> to
>> > > > use my component/endpoint configuration to set the options on the
>> > > > RecipientList through the Reifier.  It's a chicken/egg scenario:
>> the
>> > > > RecipientListReifier needs the Route, and the Route needs the
>> > processor.
>> > > >
>> > > > 3. What other approach am I missing that might be better than this?
>> > > >
>> > > > Thanks,
>> > > > Steve
>> > > >
>> > >
>> > >
>> > > --
>> > > Claus Ibsen
>> > > -----------------
>> > > @davsclaus
>> > > Camel in Action 2: https://www.manning.com/ibsen2
>> > >
>> >
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> @davsclaus
>> Camel in Action 2: https://www.manning.com/ibsen2
>>
>

Reply via email to