diff --git a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java index d95d16ec6..62008c4ee 100644 --- a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java +++ b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java @@ -11,14 +11,17 @@ import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.util.*; -import com.genexus.ModelContext; -import com.genexus.util.IniFile; +import java.net.URI; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import javax.net.ssl.SSLContext; + import org.apache.http.*; -import com.genexus.CommonUtil; -import com.genexus.specific.java.*; import org.apache.http.HttpResponse; import org.apache.http.client.config.CookieSpecs; +import org.apache.http.conn.routing.HttpRoute; import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.protocol.HttpContext; import org.apache.http.auth.AuthSchemeProvider; import org.apache.http.auth.AuthScope; @@ -43,17 +46,21 @@ import org.apache.http.impl.auth.SPNegoSchemeFactory; import org.apache.http.impl.client.*; import org.apache.http.impl.conn.DefaultProxyRoutePlanner; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.message.BasicHeaderElementIterator; import org.apache.http.protocol.HTTP; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.SSLContexts; import org.apache.http.util.EntityUtils; import org.apache.logging.log4j.Logger; -import com.genexus.webpanels.HttpContextWeb; -import java.net.URI; -import javax.net.ssl.SSLContext; +import com.genexus.webpanels.HttpContextWeb; +import com.genexus.ModelContext; +import com.genexus.management.HTTPConnectionJMX; +import com.genexus.management.HTTPPoolJMX; +import com.genexus.util.IniFile; +import com.genexus.Application; +import com.genexus.CommonUtil; +import com.genexus.specific.java.*; public class HttpClientJavaLib extends GXHttpClient { @@ -75,12 +82,21 @@ private static void getPoolInstance() { connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); connManager.setMaxTotal((int) CommonUtil.val(clientCfg.getProperty("Client", "HTTPCLIENT_MAX_SIZE", "1000"))); connManager.setDefaultMaxPerRoute((int) CommonUtil.val(clientCfg.getProperty("Client", "HTTPCLIENT_MAX_PER_ROUTE", "1000"))); + + if (Application.isJMXEnabled()) + HTTPPoolJMX.CreateHTTPPoolJMX(connManager); } else { connManager.closeExpiredConnections(); } } + @Override + protected void finalize() { + this.closeOpenedStreams(); + executor.shutdown(); + } + private ConnectionKeepAliveStrategy generateKeepAliveStrategy() { return new ConnectionKeepAliveStrategy() { @Override @@ -110,7 +126,6 @@ public void setTimeout(int timeout) } private static Logger logger = org.apache.logging.log4j.LogManager.getLogger(HttpClientJavaLib.class); - private static PoolingHttpClientConnectionManager connManager = null; private Integer statusCode = 0; private String reasonLine = ""; @@ -127,8 +142,9 @@ public void setTimeout(int timeout) private static IniFile clientCfg = new ModelContext(ModelContext.getModelContextPackageClass()).getPreferences().getIniFile(); private static final String SET_COOKIE = "Set-Cookie"; private static final String COOKIE = "Cookie"; - private java.util.Vector streamsToClose; + private static HashSet storedRoutes = new HashSet<>(); + private void closeOpenedStreams() { @@ -599,8 +615,12 @@ public void execute(String method, String url) { this.reasonLine = ""; } finally { - if (getIsURL()) - { + if (Application.isJMXEnabled()){ + if (executor.isShutdown()) + executor = Executors.newSingleThreadExecutor(); + executor.submit(this::displayHTTPConnections); + } + if (getIsURL()) { this.setHost(getPrevURLhost()); this.setBaseURL(getPrevURLbaseURL()); this.setPort(getPrevURLport()); @@ -611,6 +631,21 @@ public void execute(String method, String url) { } } + private static ExecutorService executor = Executors.newSingleThreadExecutor(); + private synchronized void displayHTTPConnections(){ + Iterator iterator = storedRoutes.iterator(); + while (iterator.hasNext()) { + HttpRoute route = iterator.next(); + HTTPConnectionJMX.DestroyHTTPConnectionJMX(route); + iterator.remove(); + } + + for (HttpRoute route : connManager.getRoutes()){ + HTTPConnectionJMX.CreateHTTPConnectionJMX(route); + storedRoutes.add(route); + } + } + public int getStatusCode() { return statusCode; } @@ -738,10 +773,4 @@ public void cleanup() { resetErrorsAndConnParams(); } - @Override - protected void finalize() - { - this.closeOpenedStreams(); - } - } \ No newline at end of file diff --git a/java/src/main/java/com/genexus/management/HTTPConnectionJMX.java b/java/src/main/java/com/genexus/management/HTTPConnectionJMX.java new file mode 100644 index 000000000..fd71f0b3a --- /dev/null +++ b/java/src/main/java/com/genexus/management/HTTPConnectionJMX.java @@ -0,0 +1,41 @@ +package com.genexus.management; + +import org.apache.http.conn.routing.HttpRoute; +import org.apache.logging.log4j.Logger; + +public class HTTPConnectionJMX implements HTTPConnectionJMXBean{ + + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HTTPConnectionJMX.class); + + HttpRoute httpRoute; + + public HTTPConnectionJMX(HttpRoute httpRoute) { + this.httpRoute = httpRoute; + } + + static public void CreateHTTPConnectionJMX(HttpRoute connection) { + try { + MBeanUtils.createMBean(connection); + } + catch (Exception e) { + log.error("Failed to register HTTP connection MBean.", e); + } + } + + static public void DestroyHTTPConnectionJMX(HttpRoute connection) { + try { + MBeanUtils.destroyMBean(connection); + } + catch (Exception e) { + log.error("Failed to destroy HTTP connection MBean.", e); + } + } + + public int getPort() { + return httpRoute.getTargetHost().getPort(); + } + + public String getHost() { + return httpRoute.getTargetHost().getHostName(); + } +} diff --git a/java/src/main/java/com/genexus/management/HTTPConnectionJMXBean.java b/java/src/main/java/com/genexus/management/HTTPConnectionJMXBean.java new file mode 100644 index 000000000..5e20f7281 --- /dev/null +++ b/java/src/main/java/com/genexus/management/HTTPConnectionJMXBean.java @@ -0,0 +1,6 @@ +package com.genexus.management; + +public interface HTTPConnectionJMXBean { + int getPort(); + String getHost(); +} \ No newline at end of file diff --git a/java/src/main/java/com/genexus/management/HTTPPoolJMX.java b/java/src/main/java/com/genexus/management/HTTPPoolJMX.java new file mode 100644 index 000000000..b8ea980a8 --- /dev/null +++ b/java/src/main/java/com/genexus/management/HTTPPoolJMX.java @@ -0,0 +1,58 @@ +package com.genexus.management; + +import javax.management.MBeanNotificationInfo; +import javax.management.Notification; +import javax.management.NotificationBroadcasterSupport; + +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.logging.log4j.Logger; +public class HTTPPoolJMX extends NotificationBroadcasterSupport implements HTTPPoolJMXMBean{ + + private long sequenceNumber=0; + PoolingHttpClientConnectionManager connectionPool; + private long lastUserWaitingForLongTimeNotif = 0L; + private long lastPoollsFullNotif = 0L; + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HTTPPoolJMX.class); + + public HTTPPoolJMX(PoolingHttpClientConnectionManager connectionPool) { + this.connectionPool = connectionPool; + } + + static public void CreateHTTPPoolJMX(PoolingHttpClientConnectionManager httpConnectionPool) { + try { + MBeanUtils.createMBean(httpConnectionPool); + } + catch(Exception e) { + log.error("Failed to register HTTP connection pool MBean.", e); + } + } + + public int getNumberOfConnectionsInUse(){ + return connectionPool.getTotalStats().getLeased(); + } + + public int getNumberOfRequestsWaiting(){ + return connectionPool.getTotalStats().getPending(); + } + + public int getNumberOfAvailableConnections(){ + return connectionPool.getTotalStats().getAvailable(); + } + + public int getMaxNumberOfConnections(){ + return connectionPool.getTotalStats().getMax(); + } + + public MBeanNotificationInfo[] getNotificationInfo() { + String[] types = new String[] {"com.genexus.managment.fullpool"}; + String name = Notification.class.getName(); + String description = "The Connection Pool does not have available connections "; + MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description); + + types = new String[] {"com.genexus.managment.longtimeuserwaiting"}; + description = "User waiting a connection for a long time"; + MBeanNotificationInfo info1 = new MBeanNotificationInfo(types, name, description); + + return new MBeanNotificationInfo[] {info, info1}; + } +} diff --git a/java/src/main/java/com/genexus/management/HTTPPoolJMXMBean.java b/java/src/main/java/com/genexus/management/HTTPPoolJMXMBean.java new file mode 100644 index 000000000..439805312 --- /dev/null +++ b/java/src/main/java/com/genexus/management/HTTPPoolJMXMBean.java @@ -0,0 +1,8 @@ +package com.genexus.management; + +public interface HTTPPoolJMXMBean { + int getNumberOfConnectionsInUse(); + int getNumberOfRequestsWaiting(); + int getNumberOfAvailableConnections(); + int getMaxNumberOfConnections(); +} \ No newline at end of file diff --git a/java/src/main/java/com/genexus/management/MBeanUtils.java b/java/src/main/java/com/genexus/management/MBeanUtils.java index ba4056d9f..4f13c0bba 100644 --- a/java/src/main/java/com/genexus/management/MBeanUtils.java +++ b/java/src/main/java/com/genexus/management/MBeanUtils.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.Vector; - import javax.management.InstanceNotFoundException; import javax.management.MBeanServer; import javax.management.MBeanServerFactory; @@ -18,301 +17,247 @@ import com.genexus.db.driver.DataSource; import com.genexus.db.driver.GXConnection; +import org.apache.http.conn.routing.HttpRoute; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.logging.log4j.Logger; + public class MBeanUtils { - - private static MBeanServer mbs = null; - private static Vector registeredObjects = new Vector(); - - public MBeanUtils() { - } - - private static MBeanServer getMBeanServer() - { - if(mbs == null) - { - try - { - ArrayList list = MBeanServerFactory.findMBeanServer(null); - if (list.size() > 0) - mbs = (MBeanServer) list.get(0); - } - catch(Throwable t) - { - t.printStackTrace(System.out); - System.exit(1); + private static MBeanServer mbs = null; + private static Vector < ObjectName > registeredObjects = new Vector<>(); + private static Logger logger = org.apache.logging.log4j.LogManager.getLogger(MBeanUtils.class); + public MBeanUtils() {} + private static MBeanServer getMBeanServer() { + if (mbs == null) { + try { + ArrayList list = MBeanServerFactory.findMBeanServer(null); + if (list.size() > 0) + mbs = (MBeanServer) list.get(0); + } catch (Throwable t) { + logger.error(t); + System.exit(1); + } } + return mbs; } - return mbs; - } - - public static void registerBean(Object mbean, String sName) { - ObjectName name = null; - try { - name = new ObjectName(sName); - } catch (MalformedObjectNameException e1) { - System.out.println(e1); - } - if (name == null) - return; - - try { - mbs.getObjectInstance(name); - } catch (InstanceNotFoundException ex) { - try - { - mbs.registerMBean(mbean, name); - registeredObjects.addElement(name); - } - catch(javax.management.InstanceAlreadyExistsException e) - { - System.out.println(e); - } - catch(javax.management.MBeanRegistrationException e) - { - System.out.println(e); - } - catch(javax.management.NotCompliantMBeanException e) - { - System.out.println(e); - } - } - } - - public static void createMBean(Namespace namespace) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; - NamespaceJMX mbean = new NamespaceJMX(namespace); - registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName,name= " + namespace.getName()); - } - - public static void createMBean(ServerUserInformation serverUserInfo, com.genexus.ModelContext context) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; + public static void registerBean(Object mbean, String sName) { + ObjectName name = null; + try { + name = new ObjectName(sName); + } catch (MalformedObjectNameException e1) { + logger.error(e1); + } + if (name == null) + return; + try { + mbs.getObjectInstance(name); + } catch (InstanceNotFoundException ex) { + try { + mbs.registerMBean(mbean, name); + registeredObjects.addElement(name); + } catch (javax.management.InstanceAlreadyExistsException e) { + logger.error(e); + } catch (javax.management.MBeanRegistrationException e) { + logger.error(e); + } catch (javax.management.NotCompliantMBeanException e) { + logger.error(e); + } + } + } - ServerUserInformationJMX mbean = new ServerUserInformationJMX(serverUserInfo, context); - registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName.User,ApplicationName=" + serverUserInfo.getNamespace().getName() + ",name=User " + serverUserInfo.getHandle()); - } - - public static void createMBean(LocalUserInformation localUserInfo) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; + public static void createMBean(Namespace namespace) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + NamespaceJMX mbean = new NamespaceJMX(namespace); + registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName,name= " + namespace.getName()); + } - - LocalUserInformationJMX mbean = new LocalUserInformationJMX(localUserInfo); + public static void createMBean(ServerUserInformation serverUserInfo, com.genexus.ModelContext context) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + ServerUserInformationJMX mbean = new ServerUserInformationJMX(serverUserInfo, context); + registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName.User,ApplicationName=" + serverUserInfo.getNamespace().getName() + ",name=User " + serverUserInfo.getHandle()); + } - registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName.User,ApplicationName=" + localUserInfo.getNamespace().getName() + ",name=User " + localUserInfo.getHandle()); + public static void createMBean(LocalUserInformation localUserInfo) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + LocalUserInformationJMX mbean = new LocalUserInformationJMX(localUserInfo); + registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName.User,ApplicationName=" + localUserInfo.getNamespace().getName() + ",name=User " + localUserInfo.getHandle()); - } - - public static void createMBean(DataSource dataSource) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; + } + public static void createMBean(DataSource dataSource) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + DataSourceJMX mbean = new DataSourceJMX(dataSource); + registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName.DataStore,ApplicationName=" + dataSource.getNamespace() + ",name=DataStore " + dataSource.name); + } - DataSourceJMX mbean = new DataSourceJMX(dataSource); - registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName.DataStore,ApplicationName=" + dataSource.getNamespace() + ",name=DataStore " + dataSource.name); - } - - public static void createMBean(ConnectionPool connectionPool) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; - ConnectionPoolJMX mbean = new ConnectionPoolJMX(connectionPool); - registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName.DataStore.ConnectionPool,ApplicationName=" + connectionPool.getDataSource().getNamespace() + ",DataStore=" + connectionPool.getDataSource().name + ",name=R/W pool"); - } - - public static void createMBean(GXConnection connection) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; - - ConnectionJMX mbean = new ConnectionJMX(connection); - registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName.DataStore.ConnectionPool.Connection,ApplicationName=" + connection.getDataSource().getNamespace() + ",DataStore=" + connection.getDataSource().name +",ConnectionPool=R/W pool" +",name=" + connection.getId()); - } - - public static void createMBean(InProcessCache cache) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; + public static void createMBean(ConnectionPool connectionPool) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + ConnectionPoolJMX mbean = new ConnectionPoolJMX(connectionPool); + registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName.DataStore.ConnectionPool,ApplicationName=" + connectionPool.getDataSource().getNamespace() + ",DataStore=" + connectionPool.getDataSource().name + ",name=R/W pool"); + } + public static void createMBean(PoolingHttpClientConnectionManager connectionPool) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + HTTPPoolJMX mbean = new HTTPPoolJMX(connectionPool); + registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.HTTPPool,ApplicationName=Http connection pool, Http connection pool id =" + connectionPool.hashCode()); + } - CacheJMX mbean = new CacheJMX(cache); - registerBean(mbean, "com.genexus.management:type=InProcessCache"); - } - - public static void createMBean(CacheValue cacheValue) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; - CacheItemJMX mbean = new CacheItemJMX(cacheValue); - registerBean(mbean, "com.genexus.management:type=InProcessCache.Item,name=" + cacheValue.hashCode()); - } - - public static void destroyMBean(ServerUserInformation serverUserInfo) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; + public static void createMBean(HttpRoute httpRoute) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + HTTPConnectionJMX mbean = new HTTPConnectionJMX(httpRoute); + registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.HTTPPool.HTTPConnection,ApplicationName=" + httpRoute.getTargetHost().getHostName() + ",Port=" + httpRoute.getTargetHost().getPort() + ",Http connection id=" + System.identityHashCode(httpRoute)); + } - try - { - ObjectName name = new ObjectName("com.genexus.management:type=GeneXusApplicationServer.ApplicationName.User,ApplicationName=" + serverUserInfo.getNamespace().getName() + ",name=User " + serverUserInfo.getHandle()); - registeredObjects.removeElement(name); + public static void createMBean(GXConnection connection) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + ConnectionJMX mbean = new ConnectionJMX(connection); + registerBean(mbean, "com.genexus.management:type=GeneXusApplicationServer.ApplicationName.DataStore.ConnectionPool.Connection,ApplicationName=" + connection.getDataSource().getNamespace() + ",DataStore=" + connection.getDataSource().name + ",ConnectionPool=R/W pool" + ",name=" + connection.getId()); + } - mbs.unregisterMBean(name); - } - catch(javax.management.MalformedObjectNameException e) - { - System.out.println(e); - } - catch(javax.management.InstanceNotFoundException e) - { - System.out.println(e); - } - catch(javax.management.MBeanRegistrationException e) - { - System.out.println(e); - } - } - - public static void destroyMBean(LocalUserInformation localUserInfo) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; + public static void createMBean(InProcessCache cache) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + CacheJMX mbean = new CacheJMX(cache); + registerBean(mbean, "com.genexus.management:type=InProcessCache"); + } - try - { - ObjectName name = new ObjectName("com.genexus.management:type=GeneXusApplicationServer.ApplicationName.User,ApplicationName=" + localUserInfo.getNamespace().getName() + ",name=User " + localUserInfo.getHandle()); - registeredObjects.removeElement(name); + public static void createMBean(CacheValue cacheValue) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + CacheItemJMX mbean = new CacheItemJMX(cacheValue); + registerBean(mbean, "com.genexus.management:type=InProcessCache.Item,name=" + cacheValue.hashCode()); + } - mbs.unregisterMBean(name); - } - catch(javax.management.MalformedObjectNameException e) - { - System.out.println(e); - } - catch(javax.management.InstanceNotFoundException e) - { - System.out.println(e); - } - catch(javax.management.MBeanRegistrationException e) - { - System.out.println(e); - } - } - - public static void destroyMBean(GXConnection connection) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; + public static void destroyMBean(ServerUserInformation serverUserInfo) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + try { + ObjectName name = new ObjectName("com.genexus.management:type=GeneXusApplicationServer.ApplicationName.User,ApplicationName=" + serverUserInfo.getNamespace().getName() + ",name=User " + serverUserInfo.getHandle()); + registeredObjects.removeElement(name); + mbs.unregisterMBean(name); + } catch (javax.management.MalformedObjectNameException e) { + logger.error(e); + } catch (javax.management.InstanceNotFoundException e) { + logger.error(e); + } catch (javax.management.MBeanRegistrationException e) { + logger.error(e); + } + } - try - { - ObjectName name = new ObjectName("com.genexus.management:type=GeneXusApplicationServer.ApplicationName.DataStore.ConnectionPool.Connection,ApplicationName=" + connection.getDataSource().getNamespace() + ",DataStore=" + connection.getDataSource().name +",ConnectionPool=R/W pool" +",name=" + connection.getId()); - registeredObjects.removeElement(name); + public static void destroyMBean(LocalUserInformation localUserInfo) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + try { + ObjectName name = new ObjectName("com.genexus.management:type=GeneXusApplicationServer.ApplicationName.User,ApplicationName=" + localUserInfo.getNamespace().getName() + ",name=User " + localUserInfo.getHandle()); + registeredObjects.removeElement(name); + mbs.unregisterMBean(name); + } catch (javax.management.MalformedObjectNameException e) { + logger.error(e); + } catch (javax.management.InstanceNotFoundException e) { + logger.error(e); + } catch (javax.management.MBeanRegistrationException e) { + logger.error(e); + } + } - mbs.unregisterMBean(name); - } - catch(javax.management.MalformedObjectNameException e) - { - System.out.println(e); - } - catch(javax.management.InstanceNotFoundException e) - { - System.out.println(e); - } - catch(javax.management.MBeanRegistrationException e) - { - System.out.println(e); - } - } - - public static void destroyMBeanCache() - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; + public static void destroyMBean(GXConnection connection) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + try { + ObjectName name = new ObjectName("com.genexus.management:type=GeneXusApplicationServer.ApplicationName.DataStore.ConnectionPool.Connection,ApplicationName=" + connection.getDataSource().getNamespace() + ",DataStore=" + connection.getDataSource().name + ",ConnectionPool=R/W pool" + ",name=" + connection.getId()); + registeredObjects.removeElement(name); + mbs.unregisterMBean(name); + } catch (javax.management.MalformedObjectNameException e) { + logger.error(e); + } catch (javax.management.InstanceNotFoundException e) { + logger.error(e); + } catch (javax.management.MBeanRegistrationException e) { + logger.error(e); + } + } - try - { - ObjectName name = new ObjectName("com.genexus.management:type=InProcessCache"); - registeredObjects.removeElement(name); + public static void destroyMBean(HttpRoute httpRoute) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + try { + ObjectName name = new ObjectName("com.genexus.management:type=GeneXusApplicationServer.HTTPPool.HTTPConnection,ApplicationName=" + httpRoute.getTargetHost().getHostName() + ",Port=" + httpRoute.getTargetHost().getPort() + ",Http connection id=" + System.identityHashCode(httpRoute)); + registeredObjects.removeElement(name); + mbs.unregisterMBean(name); + } catch (javax.management.MalformedObjectNameException e) { + logger.error(e); + } catch (javax.management.InstanceNotFoundException e) { + logger.error(e); + } catch (javax.management.MBeanRegistrationException e) { + logger.error(e); + } + } - mbs.unregisterMBean(name); - } - catch(javax.management.MalformedObjectNameException e) - { - System.out.println(e); - } - catch(javax.management.InstanceNotFoundException e) - { - System.out.println(e); - } - catch(javax.management.MBeanRegistrationException e) - { - System.out.println(e); - } - } - - public static void destroyMBean(CacheValue cacheValue) - { - MBeanServer mbs = getMBeanServer(); - if (mbs == null) - return; + public static void destroyMBeanCache() { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + try { + ObjectName name = new ObjectName("com.genexus.management:type=InProcessCache"); + registeredObjects.removeElement(name); + mbs.unregisterMBean(name); + } catch (javax.management.MalformedObjectNameException e) { + logger.error(e); + } catch (javax.management.InstanceNotFoundException e) { + logger.error(e); + } catch (javax.management.MBeanRegistrationException e) { + logger.error(e); + } + } - try - { - ObjectName name = new ObjectName("com.genexus.management:type=InProcessCache.Item,name=" + cacheValue.hashCode()); - registeredObjects.removeElement(name); + public static void destroyMBean(CacheValue cacheValue) { + MBeanServer mbs = getMBeanServer(); + if (mbs == null) + return; + try { + ObjectName name = new ObjectName("com.genexus.management:type=InProcessCache.Item,name=" + cacheValue.hashCode()); + registeredObjects.removeElement(name); + mbs.unregisterMBean(name); + } catch (javax.management.MalformedObjectNameException e) { + logger.error(e); + } catch (javax.management.InstanceNotFoundException e) { + logger.error(e); + } catch (javax.management.MBeanRegistrationException e) { + logger.error(e); + } + } - mbs.unregisterMBean(name); - } - catch(javax.management.MalformedObjectNameException e) - { - System.out.println(e); - } - catch(javax.management.InstanceNotFoundException e) - { - System.out.println(e); - } - catch(javax.management.MBeanRegistrationException e) - { - System.out.println(e); - } - } - - public static void unregisterObjects() - { - try - { - for (int i = 0; i < registeredObjects.size(); i++) - { - mbs.unregisterMBean((ObjectName) registeredObjects.elementAt(i)); + public static void unregisterObjects() { + try { + for (int i = 0; i < registeredObjects.size(); i++) { + mbs.unregisterMBean(registeredObjects.elementAt(i)); + } + } catch (javax.management.InstanceNotFoundException e) { + logger.error(e); + } catch (javax.management.MBeanRegistrationException e) { + logger.error(e); } - } - catch(javax.management.InstanceNotFoundException e) - { - System.out.println(e); - } - catch(javax.management.MBeanRegistrationException e) - { - System.out.println(e); - } - mbs = null; - } -} + mbs = null; + } +} \ No newline at end of file