/*******************************************************************************
* Copyright (c) 2008, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.kernel.services.concurrent.management;
import java.lang.management.ManagementFactory;
import java.util.HashSet;
import java.util.Set;
import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.eclipse.virgo.kernel.services.concurrent.ExecutorServiceInfo;
import org.eclipse.virgo.kernel.services.concurrent.ExecutorServiceStatistics;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implementation of {@link ExecutorServiceExporter} that exports to JMX
* <p />
*
* <strong>Concurrent Semantics</strong><br />
*
* Threasafe
*
*/
public class JmxExecutorServiceExporter implements ExecutorServiceExporter {
private static final String OBJECT_NAME_PATTERN = "%s:type=Executor Service,name=%s";
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
private final Set<ObjectName> exportedExecutorServices = new HashSet<ObjectName>();
private final String managementDomain;
public JmxExecutorServiceExporter(String managementDomain) {
this.managementDomain = managementDomain;
}
public void export(ExecutorServiceStatistics executorService) {
try {
ObjectName name = new ObjectName(String.format(OBJECT_NAME_PATTERN, this.managementDomain, executorService.getPoolName()));
ExecutorServiceInfo info = new StandardExecutorServiceInfo(executorService);
this.server.registerMBean(info, name);
synchronized (this.exportedExecutorServices) {
this.exportedExecutorServices.add(name);
}
} catch (JMException e) {
this.logger.warn(String.format("Unable to register executor service %s for management", executorService), e);
}
}
public void destroy() {
synchronized (this.exportedExecutorServices) {
for (ObjectName exportedExecutorService : this.exportedExecutorServices) {
try {
this.server.unregisterMBean(exportedExecutorService);
} catch (JMException e) {
this.logger.warn(String.format("Unable to unregister executor service %s from management", exportedExecutorService), e);
}
}
}
}
}