2 * Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.md.sal.common.util.jmx;
11 import com.google.common.base.Preconditions;
12 import java.util.concurrent.BlockingQueue;
13 import java.util.concurrent.Executor;
14 import java.util.concurrent.RejectedExecutionHandler;
15 import java.util.concurrent.ThreadPoolExecutor;
16 import javax.annotation.Nullable;
17 import org.opendaylight.yangtools.util.concurrent.CountingRejectedExecutionHandler;
18 import org.opendaylight.yangtools.util.concurrent.TrackingLinkedBlockingQueue;
21 * MXBean implementation of the ThreadExecutorStatsMXBean interface that retrieves statistics
22 * from a backing {@link java.util.concurrent.ExecutorService}.
24 * @author Thomas Pantelis
26 public class ThreadExecutorStatsMXBeanImpl extends AbstractMXBean
27 implements ThreadExecutorStatsMXBean {
29 private final ThreadPoolExecutor executor;
32 * Constructs an instance for the given {@link Executor}.
34 * @param executor the backing {@link Executor}
35 * @param mBeanName Used as the <code>name</code> property in the bean's ObjectName.
36 * @param mBeanType Used as the <code>type</code> property in the bean's ObjectName.
37 * @param mBeanCategory Used as the <code>Category</code> property in the bean's ObjectName.
39 public ThreadExecutorStatsMXBeanImpl(Executor executor, String mBeanName,
40 String mBeanType, @Nullable String mBeanCategory) {
41 super(mBeanName, mBeanType, mBeanCategory);
43 Preconditions.checkArgument(executor instanceof ThreadPoolExecutor,
44 "The ExecutorService of type {} is not an instanceof ThreadPoolExecutor",
46 this.executor = (ThreadPoolExecutor)executor;
50 public long getCurrentThreadPoolSize() {
51 return executor.getPoolSize();
55 public long getLargestThreadPoolSize() {
56 return executor.getLargestPoolSize();
60 public long getMaxThreadPoolSize() {
61 return executor.getMaximumPoolSize();
65 public long getCurrentQueueSize() {
66 return executor.getQueue().size();
70 public Long getLargestQueueSize() {
71 BlockingQueue<Runnable> queue = executor.getQueue();
72 if(queue instanceof TrackingLinkedBlockingQueue) {
73 return Long.valueOf(((TrackingLinkedBlockingQueue<?>)queue).getLargestQueueSize());
80 public long getMaxQueueSize() {
81 long queueSize = executor.getQueue().size();
82 return executor.getQueue().remainingCapacity() + queueSize;
86 public long getActiveThreadCount() {
87 return executor.getActiveCount();
91 public long getCompletedTaskCount() {
92 return executor.getCompletedTaskCount();
96 public long getTotalTaskCount() {
97 return executor.getTaskCount();
101 public Long getRejectedTaskCount() {
102 RejectedExecutionHandler rejectedHandler = executor.getRejectedExecutionHandler();
103 if(rejectedHandler instanceof CountingRejectedExecutionHandler) {
104 return Long.valueOf(((CountingRejectedExecutionHandler)rejectedHandler)
105 .getRejectedTaskCount());
112 * Returns a {@link ThreadExecutorStats} instance containing a snapshot of the statistic
115 public ThreadExecutorStats toThreadExecutorStats() {
116 return new ThreadExecutorStats(getActiveThreadCount(), getCurrentThreadPoolSize(),
117 getLargestThreadPoolSize(), getMaxThreadPoolSize(), getCurrentQueueSize(),
118 getLargestQueueSize(), getMaxQueueSize(), getCompletedTaskCount(),
119 getTotalTaskCount(), getRejectedTaskCount());