You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "ASF GitHub Bot (JIRA)" <ji...@apache.org> on 2018/05/09 18:20:00 UTC

[jira] [Commented] (NIFI-5073) JMSConnectionFactory doesn't resolve 'variables' properly

    [ https://issues.apache.org/jira/browse/NIFI-5073?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16469247#comment-16469247 ] 

ASF GitHub Bot commented on NIFI-5073:
--------------------------------------

Github user markap14 commented on a diff in the pull request:

    https://github.com/apache/nifi/pull/2653#discussion_r187131152
  
    --- Diff: nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/main/java/org/apache/nifi/jms/cf/JMSConnectionFactoryProvider.java ---
    @@ -159,13 +159,15 @@ public void enable(ConfigurationContext context) throws InitializationException
                     if (logger.isInfoEnabled()) {
                         logger.info("Configuring " + this.getClass().getSimpleName() + " for '"
                                 + context.getProperty(CONNECTION_FACTORY_IMPL).evaluateAttributeExpressions().getValue() + "' to be connected to '"
    -                            + BROKER_URI + "'");
    +                            + context.getProperty(BROKER_URI).evaluateAttributeExpressions().getValue() + "'");
                     }
    +
                     // will load user provided libraries/resources on the classpath
    -                Utils.addResourcesToClasspath(context.getProperty(CLIENT_LIB_DIR_PATH).evaluateAttributeExpressions().getValue());
    +                final String clientLibPath = context.getProperty(CLIENT_LIB_DIR_PATH).evaluateAttributeExpressions().getValue();
    +                ClassLoader customClassLoader = ClassLoaderUtils.getCustomClassLoader(clientLibPath, this.getClass().getClassLoader(), null);
    +                Thread.currentThread().setContextClassLoader(customClassLoader);
    --- End diff --
    
    The problem with this approach I think is that we're now creating the ClassLoader and using it to create the connection factory. However, when we do that, we would need to ensure that any access to the connection factory instance also is performed using the ClassLoader. Since all calls into this Controller Service could come from different threads, I think this is going to cause a problem.
    
    I think the typical pattern here is to update the property descriptor of CLIENT_LIB_DIR_PATH to include .dynamicallyModifiesClassPath(true). In this case, the framework will automatically handle creating the appropriate ClassLoader for each instance of the controller service and will also ensure that the appropriate ClassLoader is set when any method on this Controller Service is invoked.


> JMSConnectionFactory doesn't resolve 'variables' properly
> ---------------------------------------------------------
>
>                 Key: NIFI-5073
>                 URL: https://issues.apache.org/jira/browse/NIFI-5073
>             Project: Apache NiFi
>          Issue Type: Bug
>          Components: Core Framework
>    Affects Versions: 1.5.0, 1.6.0
>            Reporter: Matthew Clarke
>            Assignee: Sivaprasanna Sethuraman
>            Priority: Major
>         Attachments: 0001-NIFI-5073-JMSConnectionFactoryProvider-now-resolves-.patch
>
>
> Create a new process Group.
> Add "Variables" to the process group:
> for example:
> broker_uri=tcp://localhost:4141
> client_libs=/NiFi/custom-lib-dir/MQlib
> con_factory=blah
> Then while that process group is selected, create  a controller service.
> Create JMSConnectionFactory.
> Configure this controller service to use EL for PG defined variables above:
> ${con_factory}, ${con_factory}, and ${broker_uri}
> The controller service will remain invalid because the EL statements are not properly resolved to their set values.
> Doing the exact same thing above using the external NiFi registry file works as expected.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)