Hi, you should proceed splitting the implementation in 2 components.
Implement your own org.apache.camel.builder.RouteBuilder to create routes Implement your own org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor to inject beans in the context Without Spring the solution I adopted was to create the Camel context with my Registry instance org.apache.camel.support.DefaultRegistry defaultRegistry = new DefaultRegistry(); //register your beans org.apache.camel.CamelContext camelContext = new DefaultCamelContext(defaultRegistry); This is not dynamic, so I suppose you have to intercept some event. Hope this can help. From: Dipak Rai <fullstackdipak...@gmail.com> Date: Tuesday, 4 March 2025 at 17:38 To: users@camel.apache.org <users@camel.apache.org> Subject: Re: Refreshing Bean To Build An IMAP Route Should Have Worked The registry.bind () documentation says that "*Binds the bean to the repository (if possible). If the bean is CamelContextAware then the registry will automatic inject the context if possible."* What does that mean ? How can I make the 'exchangeAuthenticator' bean CamelContextAware? On Tue, Mar 4, 2025 at 9:48 PM Dipak Rai <fullstackdipak...@gmail.com> wrote: > Hi, > > To add to my code snippet, I see in the logs that I could unbind the bean > and rebind it but somehow in the route url this string > *"?authenticator=#exchangeAuthenticator" > *does not show the updated values. I still get the error for the wrong > *tenantID > *I passed deliberately before last tim > *e.* > > *ERROR:* > > *c.n.w.r.RouterUtil: Exception occurred while creating IMAP route: > {}Failed to start route mail-route-imap because of > com.microsoft.aad.msal4j.MsalServiceException: AADSTS900023: Specified > tenant identifier '5d471751-******-70f44f9630b' is neither a valid DNS > name, nor a valid external domain. * > > *Old wrong tenantID: * *5d471751-******-70f44f9630b* > New correct tenantID passed to the bean: *5d471751-******-70f44f9630b**0* > *But this last correct one is not picked up by the route.* > > Regards, > Dipak. > > > On Tue, Mar 4, 2025 at 8:53 PM Dipak Rai <fullstackdipak...@gmail.com> > wrote: > >> Hi, >> >> Yes, Riccardo. >> >> //code snippet removing the route before recreating the authenticator bean >> Route route = camelContext.getRoute(MyConstants.IMAP_ROUTE_ID); >> if (route != null) { >> camelContext.getRouteController().stopRoute(MyConstants.IMAP_ROUTE_ID); >> camelContext.removeRoute(MyConstants.IMAP_ROUTE_ID); >> } >> camelContext.addRoutes(new RouteBuilder() { >> @Override >> public void configure() throws Exception { >> from(getImapConfig(imapMailId, imapPort, pollingInterval, debugMode)) >> .routeId(MyConstants.IMAP_ROUTE_ID) >> .autoStartup(true) >> .to("direct:gotosecondstep"); >> } >> }); >> >> >> //method where the route is being built as a string >> public String getImapConfig(String imapUrl, String imapPort, String >> pollingInterval, String debugMode) { >> authenticatorService.updateAuthenticator(); >> return "imaps://" + imapUrl + ":" + imapPort >> + "?authenticator=#exchangeAuthenticator" >> + "&debugMode="+ debugMode >> + "&delete=false" >> + "&unseen=true" >> + "&delay=" + pollingInterval >> + "&mail.imaps.auth.mechanisms=XOAUTH2" >> + "&disconnect=true" >> + "&closeFolder=true"; >> } >> >> Regards. >> >> On Tue, Mar 4, 2025 at 4:22 PM Modanese, Riccardo >> <riccardo.modan...@eurotech.com.invalid> wrote: >> >>> Hi, >>> I’ injecting beans at runtime using Camel with and >>> without Spring (and it works) but, I did it before starting the route. >>> From my understanding you are trying to replace a bean in the context >>> once the route is running, am I right? >>> If so, did you try to restart the route once you replace the bean in the >>> context? >>> >>> Riccardo >>> >>> From: Dipak Rai <fullstackdipak...@gmail.com> >>> Date: Tuesday, 4 March 2025 at 11:47 >>> To: users@camel.apache.org <users@camel.apache.org> >>> Subject: Re: Refreshing Bean To Build An IMAP Route Should Have Worked >>> I'll rephrase my question here. >>> Is it possible to just kick out the old bean from the Camel Context (and >>> in >>> turn from the Spring context) and inject a new bean while using the same >>> to >>> build a route dynamically as shown below? I don't see any explicit ' >>> *unbind()*' method with the *ApplicationContextBeanRepository*. >>> >>> *Code snippet:* >>> public void updateAuthenticator() { >>> String tenantId = emailConfigBean.getTenantId(); >>> String clientId = emailConfigBean.getClientId(); >>> String clientSecret = emailConfigBean.getClientSecret(); >>> String wsAdapterMailBox = emailConfigBean.getWSAdapterMailBox(); >>> >>> try { >>> MicrosoftExchangeOnlineOAuth2MailAuthenticator newExchangeAuthenticator = >>> new MicrosoftExchangeOnlineOAuth2MailAuthenticator( >>> tenantId, clientId, clientSecret, wsAdapterMailBox); >>> Registry registry = camelContext.getRegistry(Registry.class); >>> MicrosoftExchangeOnlineOAuth2MailAuthenticator existingAuthenticatorBean >>> = >>> registry.lookupByNameAndType("exchangeAuthenticator", >>> MicrosoftExchangeOnlineOAuth2MailAuthenticator.class); >>> // Unbind the existing 'exchangeAuthenticator' bean >>> if (null != existingAuthenticatorBean) { >>> registry.unbind("exchangeAuthenticator"); >>> } >>> // Bind the new 'exchangeAuthenticator' bean >>> registry.bind("exchangeAuthenticator", newExchangeAuthenticator); >>> } catch (Exception e) { >>> } >>> } >>> >>> >>> On Tue, Mar 4, 2025 at 10:40 AM Dipak Rai <fullstackdipak...@gmail.com> >>> wrote: >>> >>> > Hi, >>> > >>> > In the below snippet I am trying to dynamically build the IMAP route by >>> > refreshing my 'exchangeAuthenticator' bean. Camel seemingly supports >>> only >>> > bean by name injection into the route. Although I am able to >>> instantiate >>> > the bean with new values yet the route refers to the old bean values >>> and >>> > fails with error. >>> > >>> > public void updateAuthenticator() { >>> > String tenantId = emailConfigBean.getTenantId(); >>> > String clientId = emailConfigBean.getClientId(); >>> > String clientSecret = emailConfigBean.getClientSecret(); >>> > String wsAdapterMailBox = emailConfigBean.getWSAdapterMailBox(); >>> > try { >>> > MicrosoftExchangeOnlineOAuth2MailAuthenticator >>> newExchangeAuthenticator = new >>> MicrosoftExchangeOnlineOAuth2MailAuthenticator( >>> > tenantId, clientId, clientSecret, wsAdapterMailBox); >>> > // Get the registry >>> > DefaultRegistry defaultRegistry = (DefaultRegistry) >>> camelContext.getRegistry(); >>> > // Unbind the existing 'exchangeAuthenticator' bean >>> > MicrosoftExchangeOnlineOAuth2MailAuthenticator exchangeAuthenticator = >>> (MicrosoftExchangeOnlineOAuth2MailAuthenticator) defaultRegistry >>> > .lookupByName("exchangeAuthenticator"); >>> > if (null != exchangeAuthenticator) { >>> > defaultRegistry.unbind("exchangeAuthenticator"); >>> > } >>> > defaultRegistry.bind("exchangeAuthenticator", >>> newExchangeAuthenticator); >>> > defaultRegistry.setCamelContext(camelContext); >>> > } catch (Exception e) { >>> > log.error("Exception in updating authenticator bean: {}", >>> e.getMessage()); >>> > } >>> > } >>> > >>> > //building the route dynamically through refreshed values of bean >>> > public String getImapConfig(String imapUrl, String imapPort, String >>> pollingInterval, String debugMode) { >>> > authenticatorService.updateAuthenticator(); >>> > return "imaps://" + imapUrl + ":" + imapPort >>> > + "?authenticator=#exchangeAuthenticator" >>> > + "&debugMode="+ debugMode >>> > + "&delete=false" >>> > + "&unseen=true" >>> > + "&delay=" + pollingInterval >>> > + "&mail.imaps.auth.mechanisms=XOAUTH2" >>> > + "&disconnect=true" >>> > + "&closeFolder=true"; >>> > } >>> > >>> > Regards, >>> > >>> > Dipak. >>> > >>> > >>> > >>> >>