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