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

Rafał Gała commented on CAMEL-14327:
------------------------------------

I wonder what the purpose of LRUCache is anyway. In ServicePool class I see 
that objects are put in this cache but never seem to be retrieved:


{code:java}
    public S acquire(Endpoint endpoint) throws Exception {
        if (!isStarted()) {
            return null;
        }
        S s = getPool(endpoint).acquire();
        if (s != null && cache != null) {
            cache.putIfAbsent(new Key<>(s), s);
        }
        return s;
    }
{code}

and the getPool():


{code:java}
    protected Pool<S> getPool(Endpoint endpoint) {
        return pool.computeIfAbsent(endpoint, this::createPool);
    }
{code}


{code:java}
    private Pool<S> createPool(Endpoint endpoint) {
        boolean singleton = endpoint.isSingleton();
        try {
            S s = producer.apply(endpoint);
            if (s instanceof IsSingleton) {
                singleton = ((IsSingleton) s).isSingleton();
            }
        } catch (Exception e) {
            // Ignore
        }
        if (singleton && capacity > 0) {
            return new SinglePool(endpoint);
        } else {
            return new MultiplePool(endpoint);
        }
    }
{code}


> Jt400PgmProducer doStop() method called on actively used instance
> -----------------------------------------------------------------
>
>                 Key: CAMEL-14327
>                 URL: https://issues.apache.org/jira/browse/CAMEL-14327
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-jt400
>    Affects Versions: 3.0.0
>            Reporter: Rafał Gała
>            Priority: Major
>             Fix For: 3.0.1, 3.1.0
>
>
> Today I migrated to 3.0.0 version and there seems to be an issue with Service 
> pooling for the Jt400PgmpProducer.
>  
> Here's what I have:
>  
> {code:java}
>     from(
>         "seda:someName?concurrentConsumers=2&size=10")
>             
> .to("jt400://{{as400.user}}:{{as400.password}}@{{as400.host}}/QSYS.LIB/PROGRAM.LIB/KFKEVR.SRVPGM?fieldsLength=200,2000,4,8,8,1000&outputFieldsIdx=0,1,2,3,4,5&connectionPool=#as400ConnectionPool&format=binary&procedureName=RECEIVEEVENT");
> {code}
> When concurrentConsumers attribute of seda endpoint is set to 1 everything 
> works fine, but when it is greater than 1 then it looks like the evict method 
> from MultiplePool class calls stop method on a Jt400PgmProducer instance that 
> is still being used (the process method on it is still getting called). This 
> results in nulling the iSeries object inside Jt400PgmProducer instance:
> {code:java}
>     @Override
>     protected void doStop() throws Exception {
>         if (iSeries != null) {
>             LOG.info("Releasing connection to {}", getISeriesEndpoint());
>             getISeriesEndpoint().releaseSystem(iSeries);
>             iSeries = null;
>         }
>     }
> {code}
> and when the process method gets called later on this instance, it fails with 
> NPE while constructing ServiceProgramCall:
> {code:java}
>     @Override
>     public void process(Exchange exchange) throws Exception {
> ...
>             pgmCall = new ServiceProgramCall(iSeries);
> ...            
> {code}
>  
> I believe this may be related to producer caching in ServicePool class, some 
> sort of key issue in the cache Map maybe?



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

Reply via email to