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 >> >