Как вызвать invoke JMX операцию с аргументами в Python? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь вызвать операции JMX из Python, используя Jpype, но получаю сообщение об ошибке при передаче аргументов.

Отлично работает для операций, не связанных с аргументами.

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» в качестве 3-го и 4-го аргументов.

1 Ответ

1 голос
/ 14 июня 2019

Подпись для метода, к которому вы пытаетесь получить доступ, является

Object  invoke(ObjectName name, String operationName, Object[] params, String[] signature)

Таким образом, необработанная строка не будет принята в качестве 3-го аргумента.Сначала вы должны создать массив объектов.Например:

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)

...