Hi Riccardo, Thank you so much for your answers on my thread request. I have already kept my Route building logic in a separate class. And only to build the IMAP *from *route dynamically I have a separate method *getImapConfig .*
After putting some log statements and checking the hashcode of the 'exchangeAuthenticator' I see that the '*exchangeAuthenticator*' bean is getting bound and unbound to the registry successfully. But the 'exchangeAutheticator' in the String being returned somehow refers to the old values of exchangeAuthenticator. Is there a better way to build this IMAP connection string so that the cached values of the bean are not referred to? public String getImapConfig(String imapUrl, String imapPort, String pollingInterval, String debugMode) { log.info("Inside getImapConfig imapUrl {} imapPort {} PollingInterval {} debugMode {} ", imapUrl, imapPort, pollingInterval, debugMode); authenticatorService.updateAuthenticator(); MicrosoftExchangeOnlineOAuth2MailAuthenticator exchangeAuthenticator = camelContext.getRegistry() .lookupByNameAndType("exchangeAuthenticator", MicrosoftExchangeOnlineOAuth2MailAuthenticator.class); if (null!=exchangeAuthenticator) { log.info(" @@## hashcode for authenticator Bean inside getImapConfig {}",exchangeAuthenticator.hashCode()); } return "imaps://" + imapUrl + ":" + imapPort + "?authenticator=#exchangeAuthenticator" + "&debugMode="+ debugMode + "&delete=false" + "&unseen=true" + "&delay=" + pollingInterval + "&mail.imaps.auth.mechanisms=XOAUTH2" + "&disconnect=true" + "&closeFolder=true"; } -Dipak. On Tue, Mar 4, 2025 at 10:28 PM Modanese, Riccardo <riccardo.modan...@eurotech.com.invalid> wrote: > 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. > >>> > > >>> > > >>> > > >>> > >> >