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.
Thanks,
Steve
On Wed, Nov 29, 2023 at 1:19 AM Claus Ibsen <[email protected]> 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 <[email protected]> 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
>