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