[英]Find JMX MBeans using Nashorn javascript jjs
我正在嘗試在Catalina / Connector / 8009 / *連接器中更改proxyName的值。 問題是嘗試查找MBean名稱時出現以下異常。
Exception in thread "main" java.lang.ClassCastException: Cannot cast java.lang.String to javax.management.QueryExp
at java.lang.invoke.MethodHandleImpl.newClassCastException(MethodHandleImpl.java:361)
at java.lang.invoke.MethodHandleImpl.castReference(MethodHandleImpl.java:356)
at jdk.nashorn.internal.scripts.Script$jmx_test_jjs.:program(jmx-test.jjs:32)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:636)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:229)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:387)
at jdk.nashorn.tools.Shell.apply(Shell.java:394)
at jdk.nashorn.tools.Shell.runScripts(Shell.java:323)
at jdk.nashorn.tools.Shell.run(Shell.java:169)
at jdk.nashorn.tools.Shell.main(Shell.java:133)
at jdk.nashorn.tools.Shell.main(Shell.java:112)
腳本是:
#! /usr/java/jdk1.8.0_25/bin/jjs
var host="jmxremotehost"
var port=7091
var serviceURL = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi"
var url = new javax.management.remote.JMXServiceURL(serviceURL);
var stringArrayType = Java.type("java.lang.String[]")
var credentials = new stringArrayType(2)
credentials[0]="jmxuser"
credentials[1]="jmxpassword"
var HashMapType = Java.type("java.util.HashMap")
var environment = new HashMapType()
environment.put("jmx.remote.credentials",credentials)
var connector = javax.management.remote.JMXConnectorFactory.connect(url,environment)
var mbeanServerConnection=connector.getMBeanServerConnection()
var ObjectNameType = Java.type("javax.management.ObjectName")
objectName = new ObjectNameType('Catalina:type=Connector,port=8009,*')
print(mbeanServerConnection.queryNames(objectName, "proxyName"), null)
問題是我不知道如何在MBeanServerConnection接口的queryNames()方法中發送Java null
或對第二個參數有效的其他任何內容。 請參閱: http : //docs.oracle.com/javase/7/docs/api/javax/management/MBeanServerConnection.html#queryMBeans%28javax.management.ObjectName,%20javax.management.QueryExp%29
僅使用null對我有效:
print(mbeanServerConnection.queryNames(objectName, null), null)
我整理了一下腳本,並使用平台MBeanServer節省了一些時間:
#! /usr/lib/jvm/jdk1.8.0_45/bin/jjs
var mbeanServerConnection=java.lang.management.ManagementFactory.getPlatformMBeanServer();
var ObjectNameType = Java.type("javax.management.ObjectName")
objectName = new ObjectNameType('*:*')
print(mbeanServerConnection.queryNames(objectName, null), null)
輸出為:
[java.lang:type = MemoryPool,name = Metaspace,java.lang:type = MemoryPool,name = PS Old Gen,java.lang:type = GarbageCollector,name = PS Scavenge,java.lang:type = MemoryPool,name = PS Eden Space,JMImplementation:type = MBeanServerDelegate,java.lang:type = Runtime,java.lang:type = Threading,java.lang:type = OperatingSystem,java.lang:type = MemoryPool,名稱=代碼緩存,java.nio :type = BufferPool,name = direct,java.lang:type = Compilation,java.lang:type = MemoryManager,name = CodeCacheManager,java.lang:type = MemoryPool,name =壓縮類空間,java.lang:type = Memory ,java.nio:type = BufferPool,名稱=映射,java.util.logging:type = Logging,java.lang:type = MemoryPool,name = PS生存空間,java.lang:type = ClassLoading,java.lang:type = MemoryManager,名稱= Metaspace Manager,com.sun.management:type=DiagnosticCommand,java.lang:type = GarbageCollector,name = PS MarkSweep,com.sun.management:type=HotSpotDiagnostic]
Java版本略新,但我認為這不是問題。
更新資料
嘗試與HBase服務器建立遠程連接,並進行模式搜索以進行更類似的測試:
#! /usr/lib/jvm/jdk1.8.0_45/bin/jjs
var host="njwmintx"
var port=10101
var serviceURL = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi"
var url = new javax.management.remote.JMXServiceURL(serviceURL);
var connector = javax.management.remote.JMXConnectorFactory.connect(url)
var mbeanServerConnection=connector.getMBeanServerConnection()
var ObjectNameType = Java.type("javax.management.ObjectName")
objectName = new ObjectNameType('Hadoop:service=HBase,name=RegionServer,*')
print(mbeanServerConnection.queryNames(objectName, null), null)
輸出為:
[Hadoop:service = HBase,名稱= RegionServer,子=服務器,Hadoop:service = HBase,名稱= RegionServer,子=區域,Hadoop:service = HBase,名稱= RegionServer,子=復制,Hadoop:service = HBase,名稱= RegionServer,sub = WAL]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.