You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2008/12/16 22:00:36 UTC

svn commit: r727148 - in /tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool: ConnectionPool.java PooledConnection.java jmx/ConnectionPool.java

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org