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

Reply via email to