【问题标题】:How to call invoke JMX operation with arguments in Python?如何在 Python 中调用带参数的调用 JMX 操作?
【发布时间】:2019-10-28 03:47:24
【问题描述】:

我正在尝试使用 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)

有人可以建议如何传递第三个和第四个参数吗?我在互联网上搜索了很多,但没有找到如何在 Python 中完成此操作的示例。所有示例都使用“None”和“None”作为第三和第四个参数。

【问题讨论】:

    标签: python-3.x jmx jpype


    【解决方案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"])
    

    同样的事情也适用于第四个参数,除了它需要是一个字符串数组。 jpype.JArray(jpype.JString)

    【讨论】:

    • 谢谢卡尔。根据您的建议,我进行了以下更改:jarray_arg = jpype.JArray(jpype.JObject)(['admin'])jsignature = jpype.JArray(jpype.JString) 并在调用 connection.invoke(javax.management.ObjectName(object),opt,jarray_arg,jsignature) 时出现另一个错误:connection.invoke(javax.management.ObjectName(object),opt,jarray_arg,jsignature ) jpype._jexception.MBeanExceptionPyRaisable: javax.management.MBeanException: 找不到操作 findUser。但 Mbean 存在。
    • 第四个参数不正确。您已将 jsignature 声明为列表类型而不是实际列表。例如“print(jpype.JArray(jpype.JInt))”告诉你这是类型“”。如果我想要一个实际的列表,我会使用“print(jpype.JArray(jpype.JInt)([1,2]))”。当然,如果您只想将null 传递给最后一个参数,请使用None。其中大部分内容都包含在即将与 JPype 0.7.0 一起发布的快速入门指南中。 link
    • 对不起,我没有java经验。所以在这种情况下,应该是什么 jsignature。我试过jsignature = jpype.JArray(jpype.JString)(['admin']) ,但它不起作用?
    • 不幸的是,我只能帮助如何将调用转换为 JPype。至于 JMX 接受哪些参数,我建议先找到一个有效的 Java 示例。
    • 这个 java 行的第四个参数的 python 等价物是什么:mbeanServerConn.invoke(ObjName, "startManagement", new Object[0], new String[0])?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多