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

Reply via email to