Author: fhanik Date: Tue Dec 16 13:00:36 2008 New Revision: 727148 URL: http://svn.apache.org/viewvc?rev=727148&view=rev Log: Implemented JMX notifications when connections fail
Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java?rev=727148&r1=727147&r2=727148&view=diff ============================================================================== --- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java (original) +++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java Tue Dec 16 13:00:36 2008 @@ -106,7 +106,11 @@ * Executor service used to cancel Futures */ protected ThreadPoolExecutor cancellator = new ThreadPoolExecutor(0,1,1000,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()); - + + /** + * reference to mbean + */ + protected org.apache.tomcat.jdbc.pool.jmx.ConnectionPool jmxPool = null; //=============================================================================== // PUBLIC METHODS @@ -393,8 +397,12 @@ return; try { con.lock(); + String trace = con.getStackTrace(); if (getPoolProperties().isLogAbandoned()) { - log.warn("Connection has been abandoned " + con + ":" +con.getStackTrace()); + log.warn("Connection has been abandoned " + con + ":" + trace); + } + if (jmxPool!=null) { + jmxPool.notify(jmxPool.NOTIFY_ABANDON, trace); } con.abandon(); } finally { @@ -740,7 +748,7 @@ java.io.PrintStream writer = new java.io.PrintStream(bout); x.printStackTrace(writer); String result = bout.toString(); - return result; + return (x.getMessage()!=null && x.getMessage().length()>0)? x.getMessage()+";"+result:result; } //end if } @@ -758,7 +766,8 @@ try { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("org.apache.tomcat.jdbc.pool.jmx:type=ConnectionPool,name="+getName()); - mbs.registerMBean(new org.apache.tomcat.jdbc.pool.jmx.ConnectionPool(this), name); + jmxPool = new org.apache.tomcat.jdbc.pool.jmx.ConnectionPool(this); + mbs.registerMBean(jmxPool, name); } catch (Exception x) { log.warn("Unable to start JMX integration for connection pool. Instance["+getName()+"] can't be monitored.",x); } @@ -769,6 +778,7 @@ MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("org.apache.tomcat.jdbc.pool.jmx:type=ConnectionPool,name="+getName()); mbs.unregisterMBean(name); + jmxPool = null; }catch (Exception x) { log.warn("Unable to stop JMX integration for connection pool. Instance["+getName()+"].",x); } Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java?rev=727148&r1=727147&r2=727148&view=diff ============================================================================== --- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java (original) +++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java Tue Dec 16 13:00:36 2008 @@ -85,7 +85,23 @@ String pwd = poolProperties.getPassword(); poolProperties.getDbProperties().setProperty("user", usr); poolProperties.getDbProperties().setProperty("password", pwd); - connection = driver.connect(driverURL, poolProperties.getDbProperties()); + try { + connection = driver.connect(driverURL, poolProperties.getDbProperties()); + } catch (Exception x) { + if (log.isDebugEnabled()) { + log.debug("Unable to connect to database.", x); + } + if (parent.jmxPool!=null) { + parent.jmxPool.notify(parent.jmxPool.NOTIFY_CONNECT, parent.getStackTrace(x)); + } + if (x instanceof SQLException) { + throw (SQLException)x; + } else { + SQLException ex = new SQLException(x.getMessage()); + ex.initCause(x); + throw ex; + } + } //set up the default state, unless we expect the interceptor to do it if (poolProperties.getJdbcInterceptors()==null || poolProperties.getJdbcInterceptors().indexOf(ConnectionState.class.getName())<0) { if (poolProperties.getDefaultReadOnly()!=null) connection.setReadOnly(poolProperties.getDefaultReadOnly().booleanValue()); Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java?rev=727148&r1=727147&r2=727148&view=diff ============================================================================== --- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java (original) +++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java Tue Dec 16 13:00:36 2008 @@ -18,22 +18,59 @@ * @author Filip Hanik */ import java.util.Properties; +import java.util.concurrent.atomic.AtomicInteger; import javax.management.DynamicMBean; +import javax.management.MBeanNotificationInfo; +import javax.management.Notification; +import javax.management.NotificationBroadcasterSupport; import org.apache.tomcat.jdbc.pool.JdbcInterceptor; -public class ConnectionPool implements ConnectionPoolMBean { +public class ConnectionPool extends NotificationBroadcasterSupport implements ConnectionPoolMBean { protected org.apache.tomcat.jdbc.pool.ConnectionPool pool = null; + protected AtomicInteger sequence = new AtomicInteger(0); public ConnectionPool(org.apache.tomcat.jdbc.pool.ConnectionPool pool) { + super(getDefaultNotificationInfo()); this.pool = pool; } public org.apache.tomcat.jdbc.pool.ConnectionPool getPool() { return pool; } - + + //================================================================= + // NOTIFICATION INFO + //================================================================= + public static final String NOTIFY_CONNECT = "CONNECTION FAILED"; + public static final String NOTIFY_ABANDON = "CONNECTION ABANDONED"; + + + + @Override + public MBeanNotificationInfo[] getNotificationInfo() { + return getDefaultNotificationInfo(); + } + + public static MBeanNotificationInfo[] getDefaultNotificationInfo() { + String[] types = new String[] {NOTIFY_CONNECT, NOTIFY_ABANDON}; + String name = Notification.class.getName(); + String description = "A connection pool error condition was met."; + MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description); + return new MBeanNotificationInfo[] {info}; + } + + public void notify(final String type, String message) { + Notification n = new Notification( + type, + this, + sequence.incrementAndGet(), + System.currentTimeMillis(), + message!=null?message:""); + sendNotification(n); + } + //================================================================= // POOL STATS //================================================================= --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org