Bug 54150

Summary: SlowQueryReportJmx mbean deregistration failure due to NPE - properties not set during pool close callback
Product: Tomcat Modules Reporter: Alex Franken <alexfranken>
Component: jdbc-poolAssignee: Tomcat Developers Mailing List <dev>
Status: RESOLVED FIXED    
Severity: normal    
Priority: P2    
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: All   

Description Alex Franken 2012-11-15 18:38:29 UTC
Found while debugging version 7.0.29

I found that our SlowQueryReportJmx mbean was not being deregistered during webapp shutdown.  I tracked this down to a NPE.  The interceptor properties are not being set (as is done in setupConnection) prior to the pool close callback.

ConnectionPool.close(boolean) poolClosed callback produces NPE in SlowQueryReportJmx.
{code}
        PoolProperties.InterceptorDefinition[] proxies = getPoolProperties().getJdbcInterceptorsAsArray();
        for (int i=0; i<proxies.length; i++) {
            try {
                proxies[i].getInterceptorClass().newInstance().poolClosed(this);
            }catch (Exception x) {
                log.debug("Unable to inform interceptor of pool closure.",x);
            }
        }
...
{code}

NPE in SlowQueryReportJmx - null.containsKey

{code}
    public ObjectName getObjectName(Class<?> clazz, String poolName) throws MalformedObjectNameException {
... NPE
        if (getProperties().containsKey(objectNameAttribute)) {
...
{code}

Sounds reasonable to set properties any time you need to instantiate interceptors.
As is done in ConnectionPool.init(PoolConfiguration)

{code}
                JdbcInterceptor interceptor = proxies[i].getInterceptorClass().newInstance();
                interceptor.setProperties(proxies[i].getProperties());
                interceptor.poolStarted(this);
{code}
Comment 1 Keiichi Fujino 2012-12-04 06:09:51 UTC
Thanks for the report.
Fixed in trunk and 7.0.x and will be included in 7.0.34 onwards.