Index: ../../../dev/grizzly2_git/modules/grizzly/src/main/java/org/glassfish/grizzly/nio/transport/jmx/NIOTransport.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP <+>/*\n * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.\n *\n * Copyright (c) 2010-2011 Oracle and/or its affiliates. All rights reserved.\n *\n * The contents of this file are subject to the terms of either the GNU\n * General Public License Version 2 only (\"GPL\") or the Common Development\n * and Distribution License(\"CDDL\") (collectively, the \"License\"). You\n * may not use this file except in compliance with the License. You can\n * obtain a copy of the License at\n * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html\n * or packager/legal/LICENSE.txt. See the License for the specific\n * language governing permissions and limitations under the License.\n *\n * When distributing the software, include this License Header Notice in each\n * file and include the License file at packager/legal/LICENSE.txt.\n *\n * GPL Classpath Exception:\n * Oracle designates this particular file as subject to the \"Classpath\"\n * exception as provided by Oracle in the GPL Version 2 section of the License\n * file that accompanied this code.\n *\n * Modifications:\n * If applicable, add the following below the License Header, with the fields\n * enclosed by brackets [] replaced by your own identifying information:\n * \"Portions Copyright [year] [name of copyright owner]\"\n *\n * Contributor(s):\n * If you wish your version of this file to be governed by only the CDDL or\n * only the GPL Version 2, indicate your decision by adding \"[Contributor]\n * elects to include this software in this distribution under the [CDDL or GPL\n * Version 2] license.\" If you don't indicate a single choice of license, a\n * recipient has the option to distribute your version of this file under\n * either the CDDL, the GPL Version 2 or to extend the choice of license to\n * its licensees as provided above. However, if you add GPL Version 2 code\n * and therefore, elected the GPL Version 2 license, then the option applies\n * only if the new code is made subject to such option by the copyright\n * holder.\n */\n\npackage org.glassfish.grizzly.nio.transport.jmx;\n\nimport org.glassfish.grizzly.Buffer;\nimport org.glassfish.grizzly.Connection;\nimport org.glassfish.grizzly.ConnectionProbe;\nimport org.glassfish.grizzly.IOEvent;\nimport org.glassfish.grizzly.Transport;\nimport org.glassfish.grizzly.TransportProbe;\nimport org.glassfish.grizzly.monitoring.jmx.GrizzlyJmxManager;\nimport org.glassfish.grizzly.monitoring.jmx.JmxObject;\nimport org.glassfish.grizzly.memory.MemoryManager;\nimport org.glassfish.grizzly.threadpool.GrizzlyExecutorService;\nimport java.util.Date;\nimport java.util.Queue;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.atomic.AtomicInteger;\nimport java.util.concurrent.atomic.AtomicLong;\nimport org.glassfish.gmbal.Description;\nimport org.glassfish.gmbal.GmbalMBean;\nimport org.glassfish.gmbal.ManagedAttribute;\nimport org.glassfish.gmbal.ManagedObject;\nimport org.glassfish.gmbal.NameValue;\nimport org.glassfish.grizzly.utils.DataStructures;\n\n/**\n * NIO Transport JMX object.\n *\n * @author Alexey Stashok\n */\n@ManagedObject\n@Description(\"Grizzly NIO Transport\")\npublic class NIOTransport extends JmxObject {\n protected final org.glassfish.grizzly.nio.NIOTransport transport;\n private final JmxTransportProbe probe;\n private final JmxConnectionProbe connectionProbe;\n\n private final AtomicLong bytesRead = new AtomicLong();\n private final AtomicLong bytesWritten = new AtomicLong();\n \n private volatile EventDate stateEvent;\n private volatile EventDate lastErrorEvent;\n\n private final ConcurrentHashMap boundConnections =\n new ConcurrentHashMap();\n\n private final Queue boundAddresses = DataStructures.getLTQInstance(String.class);\n\n private final AtomicInteger openConnectionsNum = new AtomicInteger();\n private final AtomicLong totalConnectionsNum = new AtomicLong();\n\n private GrizzlyJmxManager mom;\n \n private MemoryManager currentMemoryManager;\n private JmxObject memoryManagerJmx;\n\n private ExecutorService currentThreadPool;\n private JmxObject threadPoolJmx;\n\n\n private final Object subtreeLock = new Object();\n\n public NIOTransport(org.glassfish.grizzly.nio.NIOTransport transport) {\n this.transport = transport;\n probe = new JmxTransportProbe();\n connectionProbe = new JmxConnectionProbe();\n }\n\n @NameValue\n public String getName() {\n return transport.getName();\n }\n\n @Override\n public String getJmxName() {\n return \"Transport\";\n }\n\n @Override\n protected void onRegister(GrizzlyJmxManager mom, GmbalMBean bean) {\n synchronized (subtreeLock) {\n this.mom = mom;\n\n transport.getMonitoringConfig().addProbes(probe);\n transport.getConnectionMonitoringConfig().addProbes(connectionProbe);\n\n rebuildSubTree();\n }\n }\n\n @Override\n protected void onDeregister(GrizzlyJmxManager mom) {\n synchronized(subtreeLock) {\n transport.getMonitoringConfig().removeProbes(probe);\n transport.getConnectionMonitoringConfig().removeProbes(connectionProbe);\n\n this.mom = null;\n }\n }\n \n @ManagedAttribute(id=\"state\")\n public String getState() {\n final EventDate stateEventDate = stateEvent;\n if (stateEventDate == null) {\n return toString(transport.getState().getState());\n }\n\n return toString(stateEventDate);\n }\n\n @ManagedAttribute(id=\"read-buffer-size\")\n public int getReadBufferSize() {\n return transport.getReadBufferSize();\n }\n\n @ManagedAttribute(id=\"write-buffer-size\")\n public int getWriteBufferSize() {\n return transport.getWriteBufferSize();\n }\n\n @ManagedAttribute(id=\"processor\")\n public String getProcessor() {\n return getType(transport.getProcessor());\n }\n\n @ManagedAttribute(id=\"processor-selector\")\n public String getProcessorSelector() {\n return getType(transport.getProcessorSelector());\n }\n\n @ManagedAttribute(id=\"io-strategy\")\n public String getIOStrategy() {\n return getType(transport.getIOStrategy());\n }\n\n @ManagedAttribute(id=\"channel-distributor\")\n public String getChannelDistributor() {\n return getType(transport.getNIOChannelDistributor());\n }\n\n @ManagedAttribute(id=\"selector-handler\")\n public String getSelectorHandler() {\n return getType(transport.getSelectorHandler());\n }\n\n @ManagedAttribute(id=\"selection-key-handler\")\n public String getSelectionKeyHandler() {\n return getType(transport.getSelectionKeyHandler());\n }\n\n @ManagedAttribute(id=\"selector-threads-count\")\n public int getSelectorHandlerRunners() {\n return transport.getSelectorRunnersCount();\n }\n\n @ManagedAttribute(id=\"thread-pool-type\")\n public String getThreadPoolType() {\n return getType(transport.getWorkerThreadPool());\n }\n\n @ManagedAttribute(id=\"last-error\")\n public String getLastError() {\n return toString(lastErrorEvent);\n }\n\n @ManagedAttribute(id=\"bytes-read\")\n public long getBytesRead() {\n return bytesRead.get();\n }\n\n @ManagedAttribute(id=\"bytes-written\")\n public long getBytesWritten() {\n return bytesWritten.get();\n }\n\n @ManagedAttribute(id=\"bound-addresses\")\n public String getBoundAddresses() {\n return boundAddresses.toString();\n }\n\n @ManagedAttribute(id=\"open-connections-count\")\n public int getOpenConnectionsCount() {\n return openConnectionsNum.get();\n }\n\n @ManagedAttribute(id=\"total-connections-count\")\n public long getTotalConnectionsCount() {\n return totalConnectionsNum.get();\n }\n\n private static String getType(Object o) {\n return o != null ? o.getClass().getName() : \"N/A\";\n }\n \n private static String toString(Object o) {\n return o != null ? o.toString() : \"N/A\";\n }\n\n protected void rebuildSubTree() {\n // rebuild memory manager sub element\n final MemoryManager memoryManager = transport.getMemoryManager();\n if (currentMemoryManager != memoryManager) {\n if (currentMemoryManager != null) {\n mom.deregister(memoryManagerJmx);\n \n currentMemoryManager = null;\n memoryManagerJmx = null;\n }\n\n if (memoryManager != null) {\n final JmxObject mmJmx = memoryManager.getMonitoringConfig().createManagementObject();\n mom.register(this, mmJmx, mmJmx.getJmxName());\n currentMemoryManager = memoryManager;\n memoryManagerJmx = mmJmx;\n }\n }\n\n final GrizzlyExecutorService threadPool = (GrizzlyExecutorService) transport.getWorkerThreadPool();\n if (currentThreadPool != threadPool) {\n if (currentThreadPool != null) {\n mom.deregister(threadPoolJmx);\n\n currentThreadPool = null;\n threadPoolJmx = null;\n }\n\n if (threadPool != null) {\n final JmxObject jmx = threadPool.getMonitoringConfig().createManagementObject();\n mom.register(this, jmx, jmx.getJmxName());\n currentThreadPool = threadPool;\n threadPoolJmx = jmx;\n }\n }\n }\n\n private static class EventDate {\n private final String event;\n private final Date date;\n\n public EventDate(String event) {\n this.event = event;\n date = new Date();\n }\n\n @Override\n public String toString() {\n return event + \" (\" + date + ')';\n }\n }\n\n private class JmxTransportProbe implements TransportProbe {\n\n @Override\n public void onStartEvent(Transport transport) {\n stateEvent = new EventDate(\"START\");\n }\n\n @Override\n public void onStopEvent(Transport transport) {\n stateEvent = new EventDate(\"STOP\");\n }\n\n @Override\n public void onPauseEvent(Transport transport) {\n stateEvent = new EventDate(\"PAUSE\");\n }\n\n @Override\n public void onResumeEvent(Transport transport) {\n stateEvent = new EventDate(\"RESUME\");\n }\n\n @Override\n public void onErrorEvent(Transport transport, Throwable error) {\n lastErrorEvent = new EventDate(error.getClass() + \": \" + error.getMessage());\n }\n\n @Override\n public void onConfigChangeEvent(Transport transport) {\n synchronized (subtreeLock) {\n rebuildSubTree();\n }\n }\n }\n\n private class JmxConnectionProbe implements ConnectionProbe {\n\n @Override\n public void onBindEvent(Connection connection) {\n final String bindAddress = connection.getLocalAddress().toString();\n if (boundConnections.putIfAbsent(connection, bindAddress) == null) {\n boundAddresses.add(bindAddress);\n }\n }\n\n @Override\n public void onAcceptEvent(Connection serverConnection,\n Connection clientConnection) {\n openConnectionsNum.incrementAndGet();\n totalConnectionsNum.incrementAndGet();\n }\n\n @Override\n public void onConnectEvent(Connection connection) {\n openConnectionsNum.incrementAndGet();\n totalConnectionsNum.incrementAndGet();\n }\n\n @Override\n public void onReadEvent(Connection connection, Buffer data, int size) {\n bytesRead.addAndGet(size);\n }\n\n @Override\n public void onWriteEvent(Connection connection, Buffer data, long size) {\n bytesWritten.addAndGet(size);\n }\n\n @Override\n public void onErrorEvent(Connection connection, Throwable error) {\n }\n\n @Override\n public void onCloseEvent(Connection connection) {\n final String bindAddress;\n if ((bindAddress = boundConnections.remove(connection)) != null) {\n boundAddresses.remove(bindAddress);\n }\n\n openConnectionsNum.decrementAndGet();\n }\n\n @Override\n public void onIOEventReadyEvent(Connection connection, IOEvent ioEvent) {\n }\n\n @Override\n public void onIOEventEnableEvent(Connection connection, IOEvent ioEvent) {\n }\n\n @Override\n public void onIOEventDisableEvent(Connection connection, IOEvent ioEvent) {\n }\n }\n}\n =================================================================== --- ../../../dev/grizzly2_git/modules/grizzly/src/main/java/org/glassfish/grizzly/nio/transport/jmx/NIOTransport.java (revision 2680ae3861ce46fb23d67ac5c3de37f60f8d08a2) +++ ../../../dev/grizzly2_git/modules/grizzly/src/main/java/org/glassfish/grizzly/nio/transport/jmx/NIOTransport.java (revision ) @@ -255,7 +255,13 @@ } } - final GrizzlyExecutorService threadPool = (GrizzlyExecutorService) transport.getWorkerThreadPool(); + final ExecutorService executorService = transport.getWorkerThreadPool(); + final GrizzlyExecutorService threadPool; + if (executorService instanceof GrizzlyExecutorService) { + threadPool = (GrizzlyExecutorService) transport.getWorkerThreadPool(); + } else { + threadPool = null; + } if (currentThreadPool != threadPool) { if (currentThreadPool != null) { mom.deregister(threadPoolJmx);