-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Filip,

On 8/5/2009 5:02 PM, Filip Hanik - Dev Lists wrote:
> and if you don't want to depend on a specific implementation, use
> reflection

Since this is a "missing feature", would it be reasonable for Tomcat to
provide a "sample" filter that webapps can use to shut down their JNDI
Resource pools?

I would be happy to write such a filter.

In fact, here it is:

import java.sql.SQLException;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.sql.DataSource;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;

/**
 * A listener to shut down the JNDI DataSource created by Tomcat
 * (but not automatically cleaned up).
 *
 * @author Chris Schultz
 * @version $Revision: 1.25 $ $Date: 2008-05-27 21:11:53 $
 */
public class JNDIDataSourceShutdownListener
    implements ServletContextListener
{
    private String _dataSourcePath;

    public void contextInitialized(ServletContextEvent e)
    {
        ServletContext application = e.getServletContext();

        _dataSourcePath
            = application.getInitParameter("JNDIDataSourceName");

        if(!_dataSourcePath.startsWith("java:"))
            _dataSourcePath = "java:/comp/env/" + _dataSourcePath;
    }

    /**
     * Attempts to close the DataSource
     */
    public void contextDestroyed(ServletContextEvent e)
    {
        ServletContext application = e.getServletContext();

        try
        {
            Context ctx = new InitialContext();

            DataSource ds = (DataSource)ctx.lookup(_dataSourcePath);

            if(null == ds)
            {
                application.log(getClass().getName()
                                + ": No DataSource found at "
                                + _dataSourcePath);
            }
            else
            {
                application.log(getClass().getName()
                                + ": Closing DataSource "
                                + _dataSourcePath);

                close(ds, application);

                application.log(getClass().getName()
                                + ": Closed DataSource "
                                + _dataSourcePath);
            }
        }
        catch (NamingException ne)
        {
            application.log(getClass().getName()
                            + ": Unable to locate DataSource at "
                            + _dataSourcePath, ne);
        }
    }

    private void close(DataSource ds, ServletContext application)
    {
        try
        {
            Method closeMethod = ds.getClass().getMethod("close", null);

            if(null == closeMethod)
                throw new NoSuchMethodException(ds.getClass().getName()
                                                + ".close()");
            closeMethod.invoke(ds, null);
        }
        catch (Exception e)
        {
            application.log(getClass().getName()
                            + ": Cannot close DataSource", e);
        }
    }
}

- -chris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkp6610ACgkQ9CaO5/Lv0PBswgCfYf0tIVZrhkmehhYQS4d3CJ01
nUMAoLM5VYy1PwDC0iNReS1yIdPIm6XN
=vTks
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to