package org.infinispan.remoting.transport.jgroups; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.infinispan.executors.LazyInitializingBlockingTaskAwareExecutorService; import org.infinispan.util.concurrent.BlockingTaskAwareExecutorServiceImpl; import org.jgroups.stack.DiagnosticsHandler; /** * A probe handler for {@link org.jgroups.tests.Probe} protocol is JGroups. * <p> * It contains a single key and returns the information about the remote thread pool executor service. * * @author Pedro Ruivo * @since 9.0 */ class ThreadPoolProbeHandler implements DiagnosticsHandler.ProbeHandler { private static final String KEY = "ispn-remote"; private volatile ExecutorService executor; @Override public Map<String, String> handleProbe(String... keys) { if (keys == null || keys.length == 0) { return null; } ThreadPoolExecutor exec = extract(executor); if (exec == null) { return null; } Map<String, String> map = new HashMap<>(); for (String key : keys) { switch (key) { case KEY: map.put("active-thread", String.valueOf(exec.getActiveCount())); map.put("min-thread", String.valueOf(exec.getCorePoolSize())); map.put("max-thread", String.valueOf(exec.getMaximumPoolSize())); map.put("current-pool-size", String.valueOf(exec.getPoolSize())); map.put("largest-pool-size", String.valueOf(exec.getLargestPoolSize())); map.put("keep-alive", String.valueOf(exec.getKeepAliveTime(TimeUnit.MILLISECONDS))); map.put("queue-size", String.valueOf(exec.getQueue().size())); break; } } return map.isEmpty() ? null : map; } @Override public String[] supportedKeys() { return new String[]{KEY}; } void updateThreadPool(ExecutorService executorService) { if (executorService != null) { this.executor = executorService; } } private static ThreadPoolExecutor extract(ExecutorService service) { if (service instanceof ThreadPoolExecutor) { return (ThreadPoolExecutor) service; } else if (service instanceof BlockingTaskAwareExecutorServiceImpl) { return extract(((BlockingTaskAwareExecutorServiceImpl) service).getExecutorService()); } else if (service instanceof LazyInitializingBlockingTaskAwareExecutorService) { return extract(((LazyInitializingBlockingTaskAwareExecutorService) service).getExecutorService()); } return null; //we don't know how to handle the remaining cases. } }