[ 
https://issues.apache.org/jira/browse/NIFI-7034?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gardella Juan Pablo reassigned NIFI-7034:
-----------------------------------------

    Assignee: Gardella Juan Pablo

> Connection leak with JMSConsumer and JMSPublisher
> -------------------------------------------------
>
>                 Key: NIFI-7034
>                 URL: https://issues.apache.org/jira/browse/NIFI-7034
>             Project: Apache NiFi
>          Issue Type: Bug
>          Components: Extensions
>    Affects Versions: 1.10.0
>         Environment: Discovered against ActiveMQ.
>            Reporter: Gardella Juan Pablo
>            Assignee: Gardella Juan Pablo
>            Priority: Critical
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> JMS connections are not closed in case of a failure. Discovered against 
> ActiveMQ, but it applies to other JMS servers. 
> The problem happens when an exception is raised and the worker is marked as 
> invalid. The current code discards the worker before closing it properly. 
> Below the details.
> h3. Details
> Any exception happening to a ConsumerJMS or PublisherJMS marks the worker as 
> invalid. After that, the worker is discarded (the worker object reference is 
> never cleaned). Below the snipped code of the issue:
> {code:java|title=AbstractJMSProcessor}
>         } finally {
>             //in case of exception during worker's connection (consumer or 
> publisher),
>             //an appropriate service is responsible to invalidate the worker.
>             //if worker is not valid anymore, don't put it back into a pool, 
> try to rebuild it first, or discard.
>             //this will be helpful in a situation, when JNDI has changed, or 
> JMS server is not available
>             //and reconnection is required.
>             if (worker == null || !worker.isValid()){
>                 getLogger().debug("Worker is invalid. Will try re-create... 
> ");
>                 final JMSConnectionFactoryProviderDefinition cfProvider = 
> context.getProperty(CF_SERVICE).asControllerService(JMSConnectionFactoryProviderDefinition.class);
>                 try {
>                     // Safe to cast. Method 
> #buildTargetResource(ProcessContext context) sets only 
> CachingConnectionFactory
>                     CachingConnectionFactory currentCF = 
> (CachingConnectionFactory)worker.jmsTemplate.getConnectionFactory();
>                     
> cfProvider.resetConnectionFactory(currentCF.getTargetConnectionFactory());
>                     worker = buildTargetResource(context);
>                 }catch(Exception e) {
>                     getLogger().error("Failed to rebuild:  " + cfProvider);
>                     worker = null;
>                 }
>             }
> {code}
> Before discard the worker, it should be cleaned all resources associated with 
> it. The proper solution is to call {{worker.shutdown()}} and then discard it.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to