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