Also the registry.unbind() says "Removes the bean from the repository (if possible)." What does this "if possible" means here?
On Tue, Mar 4, 2025 at 10:07 PM Dipak Rai <fullstackdipak...@gmail.com> wrote: > 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. >>>> > >>>> > >>>> > >>>> >>>