我试图使用Jpype从Python调用JMX操作,但是在传递参数时出现错误。
对于不涉及任何参数的操作,它工作得很好。
import jpype
from jpype import java
from jpype import javax
HOST='localhost'
PORT=9000
USER=''
PASS=''
URL = "service:jmx:rmi:///jndi/rmi://%s:%d/jmxrmi" % (HOST, PORT)
#this it the path of your libjvm /usr/lib/jvm/sun-jdk-<version>/jre/lib/amd64/server/libjvm.so on linux
jpype.startJVM("/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so")
java.lang.System.out.println("JVM load OK")
jhash = java.util.HashMap()
jarray=jpype.JArray(java.lang.String)([USER,PASS])
jhash.put (javax.management.remote.JMXConnector.CREDENTIALS, jarray);
jmxurl = javax.management.remote.JMXServiceURL(URL)
jmxsoc = javax.management.remote.JMXConnectorFactory.connect(jmxurl,jhash)
connection = jmxsoc.getMBeanServerConnection();
# This invoke operation works fine as it does not expect any arguments
object = 'Catalina:type=ThreadPool,name="http-nio-8080"'
attribute = "hasNegotiableProtocols"
print(connection.invoke(javax.management.ObjectName(object),attribute, None, None))
# This invoke operation expects string argument ("admin" in this case)
object = "Users:type=UserDatabase,database=UserDatabase"
opt = "findUser"
connection.invoke(javax.management.ObjectName(object),opt,'admin',None)
有人可以建议如何准确传递第3和第4个参数吗?我在互联网上进行了很多搜索,但没有找到如何在Python中完成此操作的示例。所有示例都将“ None”和“ None”用作第三个和第四个参数。
答案 0 :(得分:1)
您尝试访问的方法的签名为
Object invoke(ObjectName name, String operationName, Object[] params, String[] signature)
因此,原始字符串将不被接受为第三个参数。您必须首先创建一个对象数组。例如:
args = jpype.JArray(jpype.JObject)(['admin'])
这等效于Java语句。
Object[] args = new Object[]{"admin"};
如果您经常调用这种类型的数组,只需创建一次列表类型,然后将其应用于所需的位置即可。
JObjectArray = jpype.JArray(jpype.JObject)
...
args = JObjectArray(["admin"])
第4个自变量同样适用,只是需要一个字符串数组。 jpype.JArray(jpype.JString)