package org.radargun.service; import java.lang.reflect.Field; import java.util.Map; import java.util.concurrent.ThreadPoolExecutor; import org.jgroups.protocols.TP; import org.jgroups.stack.Protocol; import org.jgroups.stack.ProtocolStack; import org.jgroups.util.TimeScheduler; import org.radargun.utils.Utils; /** * JGroupsDumper modified for JGroups 4 * * @author Roman Macor (rmacor@redhat.com) */ public class JGroups4Dumper extends JGroupsDumper { public JGroups4Dumper(ProtocolStack protocols, long interval) { super(protocols, interval); } @Override protected void addDumpers(){ dumpers.add(new UNICAST3Dumper()); dumpers.add(new JGroups4Dumper.TPDumper()); } @Override protected Map<String, Object> getStats(Protocol protocol){ return stack.dumpStats(protocol.getName(), null); } protected static class TPDumper extends JGroupsDumper.TPDumper { @Override public void dump(Protocol protocol) { TP tp = (TP) protocol; boolean dump = false; dump = checkThreadPool((ThreadPoolExecutor) tp.getThreadPool(), "JGroups") || dump; try { Field f = TP.class.getDeclaredField("internal_pool"); f.setAccessible(true); dump = checkThreadPool((ThreadPoolExecutor) f.get(tp), "Internal") || dump; } catch (Exception e) { log.error("Failed to get internal pool"); } TimeScheduler timer = tp.getTimer(); try { Field f = timer.getClass().getDeclaredField("pool"); f.setAccessible(true); dump = checkThreadPool((ThreadPoolExecutor) f.get(timer), "Timer") || dump; } catch (Exception e) { log.error("Failed to get timer thread pool: " + timer.getClass()); } if (dump) Utils.threadDump(); } } }