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

Reply via email to