1 23 package com.sun.enterprise.resource.monitor; 24 25 import java.security.AccessController ; 26 import java.security.PrivilegedAction ; 27 import java.util.ArrayList ; 28 import java.util.HashMap ; 29 import java.util.Hashtable ; 30 import java.util.Iterator ; 31 import java.util.List ; 32 import java.util.Map ; 33 import java.util.concurrent.ConcurrentHashMap ; 34 import java.util.logging.Level ; 35 import java.util.logging.Logger ; 36 37 import javax.management.j2ee.statistics.Stats ; 38 39 import com.sun.enterprise.PoolManager; 40 import com.sun.enterprise.Switch; 41 import com.sun.enterprise.admin.monitor.registry.MonitoredObjectType; 42 import com.sun.enterprise.admin.monitor.registry.MonitoringLevel; 43 import com.sun.enterprise.admin.monitor.registry.MonitoringLevelListener; 44 import com.sun.enterprise.admin.monitor.registry.MonitoringRegistry; 45 import com.sun.enterprise.admin.monitor.stats.ConnectionFactoryStats; 46 import com.sun.enterprise.config.serverbeans.ConnectorConnectionPool; 47 import com.sun.enterprise.connectors.ConnectorConstants; 48 import com.sun.enterprise.connectors.ConnectorRegistry; 49 import com.sun.enterprise.resource.MonitorableResourcePool; 50 import com.sun.enterprise.server.ApplicationServer; 51 import com.sun.enterprise.server.ResourcesUtil; 52 import com.sun.enterprise.server.ServerContext; 53 import com.sun.logging.LogDomains; 54 55 import com.sun.enterprise.resource.MonitorableResourcePool; 56 import com.sun.enterprise.resource.ResourcePool; 57 58 68 public class ConnectorPoolMonitoringLevelListener implements MonitoringLevelListener { 70 private ResourcesUtil resUtil_; 71 private PoolManager poolManager_; 72 73 private MonitoringRegistry registry_; 74 75 private static final MonitoringLevel OFF = MonitoringLevel.OFF; 76 private static final MonitoringLevel HIGH = MonitoringLevel.HIGH; 77 private static final MonitoringLevel LOW = MonitoringLevel.LOW; 78 79 private static Logger _logger = LogDomains.getLogger( 80 LogDomains.RSR_LOGGER ); 81 82 public ConnectorPoolMonitoringLevelListener() { 83 } 84 85 89 public void setLevel( MonitoringLevel level ) {} 91 92 101 public void changeLevel( MonitoringLevel from, MonitoringLevel to, 102 Stats handback ) {} 103 104 public void changeLevel(MonitoringLevel from, MonitoringLevel to, 105 MonitoredObjectType type) { 106 107 110 if ( from == to ) { 111 return; 113 } 114 115 AccessController.doPrivileged(new PrivilegedAction () { 116 public Object run() { 117 ServerContext ctxt = ApplicationServer.getServerContext(); 118 if (ctxt != null ) { 119 registry_ = ctxt.getMonitoringRegistry(); 120 } 121 return null; 122 } 123 }); 124 125 if (from == OFF || from == LOW ) { 126 if ( to == HIGH ) { 127 logFine("Changing level from " + from +" to HIGH"); 128 transitionToHigh(); 129 } 130 } 131 132 if (from == HIGH || from == LOW ) { 133 if ( to == OFF ) { 134 logFine("Switching level from " + from + " to OFF"); 135 switchOffMonitoring(); 136 } 137 } 138 139 if (from == OFF || from == HIGH ) { 140 if ( to == LOW ) { 141 logFine("Changing level from " + from + " to LOW"); 142 transitionToLow(); 143 } 144 } 145 146 } 147 148 152 protected String getRAName(String resourceAdapterName) { 153 int delimIdx = resourceAdapterName.indexOf(ConnectorConstants. 154 EMBEDDEDRAR_NAME_DELIMITER); 155 if (delimIdx == -1) { 156 return resourceAdapterName; 157 } else { 158 return resourceAdapterName.substring(delimIdx + 1); 159 } 160 } 161 162 166 protected String getAppName(String resourceAdapterName) { 167 int delimIdx = resourceAdapterName.indexOf(ConnectorConstants. 168 EMBEDDEDRAR_NAME_DELIMITER); 169 if (delimIdx == -1) { 170 return null; 171 } else { 172 return resourceAdapterName.substring(0, delimIdx); 173 } 174 } 175 176 177 181 private Map <ConnectorConnectionPool, MonitorableResourcePool> getPoolMap() { 182 ResourcesUtil resUtil = ResourcesUtil.getInstance(); 183 184 ConnectorConnectionPool[] cp = resUtil.getConnectorConnectionPools(); 185 if (cp == null) { 186 return null; 187 } 188 189 Map <ConnectorConnectionPool, MonitorableResourcePool> poolMap = 190 new HashMap <ConnectorConnectionPool, MonitorableResourcePool>(); 191 ConcurrentHashMap allPools = getPoolManager().getPoolTable(); 192 193 for( int i = 0 ; i < cp.length; i++ ) { 194 if (!(cp[i].getName().equalsIgnoreCase( 195 ConnectorConstants.DEFAULT_JMS_ADAPTER))) { 196 ResourcePool p = (ResourcePool) allPools.get( cp[i].getName() ); 197 198 if (p != null && (p instanceof MonitorableResourcePool )) { 199 poolMap.put(cp[i], (MonitorableResourcePool)p); 200 } 201 } 202 } 203 204 return poolMap; 205 } 206 207 231 232 private PoolManager getPoolManager() { 233 return Switch.getSwitch().getPoolManager(); 234 } 235 236 private void transitionToHigh() { 237 AccessController.doPrivileged( new PrivilegedAction () { 238 public Object run() { 239 Map <ConnectorConnectionPool, MonitorableResourcePool> poolMap 242 = getPoolMap(); 243 if (poolMap == null) { 244 return null; 245 } 246 247 for (ConnectorConnectionPool ccp : poolMap.keySet() ) { 248 MonitorableResourcePool pool = poolMap.get(ccp); 249 if ( pool != null ) { 250 try { 251 ConnectorConnectionPoolStatsImpl stats = new 252 ConnectorConnectionPoolStatsImpl(pool); 253 getPoolManager().setMonitoringEnabledHigh( 254 pool.getPoolName()); 255 registry_.registerConnectorConnectionPoolStats( 256 stats, pool.getPoolName(), 257 getAppName(ccp.getResourceAdapterName()), 258 getRAName(ccp.getResourceAdapterName()), 259 null); 260 } catch (Exception mre) { 261 try { 262 _logger.log( Level.WARNING, "poolmon.cannot_reg", 263 mre.getMessage() ); 264 getPoolManager().disableMonitoring( 265 pool.getPoolName()); 266 } catch (Exception ex) { 267 } 269 } 270 } 271 } 272 return null; 273 } 274 }); 275 } 276 277 private void switchOffMonitoring() { 278 AccessController.doPrivileged( new PrivilegedAction () { 280 public Object run() { 281 Map <ConnectorConnectionPool, MonitorableResourcePool> 283 pools = getPoolMap(); 284 if (pools == null) { 285 return null; 286 } 287 288 for (ConnectorConnectionPool ccp : pools.keySet() ) { 289 MonitorableResourcePool pool = pools.get(ccp); 290 if (pool != null) { 291 try { 292 registry_.unregisterConnectorConnectionPoolStats( 293 pool.getPoolName(), 294 getAppName(ccp.getResourceAdapterName()), 295 getRAName(ccp.getResourceAdapterName()) ); 296 getPoolManager().disableMonitoring( 297 pool.getPoolName()); 298 } catch( Exception mre ) { 299 _logger.log( Level.INFO, "poolmon.cannot_unreg"); 300 } 301 } 302 } 303 304 return null; 305 } 306 }); 307 } 308 309 private void transitionToLow() { 310 AccessController.doPrivileged( new PrivilegedAction () { 311 public Object run() { 312 Map <ConnectorConnectionPool, MonitorableResourcePool> poolMap 315 = getPoolMap(); 316 if (poolMap == null) { 317 return null; 318 } 319 320 for (ConnectorConnectionPool ccp : poolMap.keySet() ) { 321 MonitorableResourcePool pool = poolMap.get(ccp); 322 if ( pool != null ) { 323 try { 324 ConnectorConnectionPoolStatsImpl stats = new 325 ConnectorConnectionPoolStatsImpl(pool); 326 getPoolManager().setMonitoringEnabledLow( 327 pool.getPoolName()); 328 registry_.registerConnectorConnectionPoolStats( 329 stats, pool.getPoolName(), 330 getAppName(ccp.getResourceAdapterName()), 331 getRAName(ccp.getResourceAdapterName()), null); 332 } catch (Exception mre) { 333 try { 334 _logger.log( Level.WARNING, "poolmon.cannot_reg", 335 mre.getMessage() ); 336 getPoolManager().disableMonitoring( 337 pool.getPoolName()); 338 } catch (Exception ex) { 339 } 341 } 342 } 343 } 344 return null; 345 } 346 }); 347 } 348 349 private void logFine( String msg ) { 350 if ( msg != null && _logger.isLoggable( Level.FINE ) ) { 351 _logger.fine( msg ); 352 } 353 } 354 } 355 | Popular Tags |