Java Jython jmxmp协议支持

Java Jython jmxmp协议支持,java,jython,jmx,Java,Jython,Jmx,我正在为开发监控脚本和模板的集合。它被调用,所有脚本都在python上 现在我想添加对一些java监控的支持。我还没有找到从CPython实现它的方法——只有从java或jython实现。因为所有的项目都在python上,所以我决定在jython上编写一个简单的脚本,它将从我的cpython类中调用 下面是我的代码的样子: #!/usr/bin/env jython #Java Dependencies import javax.management.remote.JMXConnector;

我正在为开发监控脚本和模板的集合。它被调用,所有脚本都在python上

现在我想添加对一些java监控的支持。我还没有找到从CPython实现它的方法——只有从java或jython实现。因为所有的项目都在python上,所以我决定在jython上编写一个简单的脚本,它将从我的cpython类中调用

下面是我的代码的样子:

#!/usr/bin/env jython

#Java Dependencies
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.lang.management.ManagementFactory;

#Python Dependencies
import sys, cmd, socket

def usage():
    print """Usage:
    jmxclient.py -h
    jmxclient.py <connect_url> <jmx_attribute_path> <jmx_property>"""

class JMXClient:
    remote = None

    def connect(self, connect_url):
        if self.remote:
            return True

        #Establish Connection to JMX Server
        url = javax.management.remote.JMXServiceURL(connect_url);
        connector = javax.management.remote.JMXConnectorFactory.connect(url);
        self.remote = connector.getMBeanServerConnection();

    def getAttribute(self, mbean_path, attribute):
        """Query the mbean server for a specific attribute and return the
        result"""
        obn =  javax.management.ObjectName(mbean_path);
        result = self.remote.getAttribute(obn, attribute);

        return result    

if len(sys.argv) <= 1:
    usage()
    sys.exit(2)

if sys.argv[1] in ('-h', '--help'):
    usage()
    sys.exit(2)

if len(sys.argv) <> 4:
    usage()
    sys.exit(2)

(connect_url, mbean_path, attribute) = sys.argv[1:]

j = JMXClient()
j.connect(connect_url)
print j.getAttribute(mbean_path, attribute)   
java.net.MalformedURLException:java.net.MalformedURLException:不支持的协议:jmxmp

(由于某些注释,行号不相关)

如何添加此jmxmp协议的支持

我发现它可能是由jmxremote_optional.jar启用的。如何将这个jar添加到jython(首选非系统范围)

更新

根据建议,我从
jmxremote-1_0_1-ri-bin-b58.zip添加了jmxremote_optional.jar和jmxremote.jar。zip
参考实现:
jython-Djava.annowed.dirs=-Dpython.path=…/jmxremote_可选.jar:…/jmxremote.jar:…/jmissl.jar jmxclient.py服务:jmx:jmxmp://localhost:9520 java.lang.ClassLoading LoadedClassCount
,但仍然收到相同的错误。我确信jmxremote_optional.jar在类路径中,代码似乎与参考示例非常相似

在阅读api文档之后,我尝试了以下更改:

url = javax.management.remote.JMXServiceURL('jmxmp', 'localhost', 9520);
connector = javax.management.remote.jmxmp.JMXMPConnector(url)
connector.connect()
self.remote = connector.getMBeanServerConnection();
这让我想到了另一个例外:

Traceback (innermost last):
  File "../src/jmxclient.py", line 87, in ?
  File "../src/jmxclient.py", line 61, in connect
        at com.sun.jmx.remote.opt.security.AdminClient.connectionOpen(AdminClient.java:209)
        at com.sun.jmx.remote.generic.ClientSynchroMessageConnectionImpl.connect(ClientSynchroMessageConnectionImpl.java:72)
        at javax.management.remote.generic.GenericConnector.connect(GenericConnector.java:177)
        at javax.management.remote.jmxmp.JMXMPConnector.connect(JMXMPConnector.java:119)
        at javax.management.remote.generic.GenericConnector.connect(GenericConnector.java:124)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
java.io.IOException: java.io.IOException: javax.management.remote.message.HandshakeBeginMessage
Jython版本是2.2,我不喜欢使用更高版本,因为这个脚本主要用于RHEL5盒,它们只有Jython 2.2.1

PS:将问题标记为已回答,因为我已决定放弃并使用jmxterm或类似工具,这一切似乎都可以通过添加-Djava.endosed.dirs=/path/to/dir_with_jmxremote_optional/与jmxmp一起使用。
但我还是想看看jython的解决方案。

伙计,我读了大约7遍

不管怎么说,我想是这样的。jmxmp协议未打包在标准J2SE运行时中。看这个。引述:

注意–如果要使用JMXMP连接器,请从下载JSR160参考实现,并将jmxremote_optional.jar文件添加到类路径中。您将在JSR160参考实现附带的JMX远程API教程中找到使用JMXMP连接器的示例


我对jython不太熟悉,但看起来这应该能帮你解决问题。

另一个选择是使用不同的堆栈,比如通过HTTP和JSON导出JMX信息的堆栈。虽然还没有Python,但是已经有了各种各样的客户端绑定(Perl、via、Javascript、Java)。但是从头开始构建一个协议应该不难,协议已经详细描述了。

我也遇到了同样的问题。解决方案是使用不同的方法导入jar
jmxremote\u optional.jar
。这里有描述

这段代码在Jython2.7中工作

def importJar(jarFile):
    from java.net import URL, URLClassLoader
    from java.lang import ClassLoader
    from java.io import File
    m = URLClassLoader.getDeclaredMethod("addURL", [URL])
    m.accessible = 1
    m.invoke(ClassLoader.getSystemClassLoader(), [File(jarFile).toURL()])

importJar("opendmk_jmxremote_optional_jar-1.0-b01-ea.jar")

from javax.management.remote import JMXServiceURL
from javax.management.remote import JMXConnector
from javax.management.remote import JMXConnectorFactory

jmx_url = JMXServiceURL("service:jmx:jmxmp://server:port/")
jmx_connector = JMXConnectorFactory.connect(jmx_url)


非常感谢,我已经阅读了示例,甚至修改并运行了它们,但通过jython仍然无法工作:(.我想我会使用纯java客户端,而不是jython客户端。但如果有更多建议,我会非常感谢。顺便说一句,我的问题到底有什么问题,我不是母语人士,也不是来自java世界,我知道我的问题并不完美,只是问我如何改进它。对不起,rvs,这不是对它是如何编写的发表评论,我只是想不通找出错误的来源。你说的(或写的)很好。哦,很抱歉我误解了你。
def importJar(jarFile):
    from java.net import URL, URLClassLoader
    from java.lang import ClassLoader
    from java.io import File
    m = URLClassLoader.getDeclaredMethod("addURL", [URL])
    m.accessible = 1
    m.invoke(ClassLoader.getSystemClassLoader(), [File(jarFile).toURL()])

importJar("opendmk_jmxremote_optional_jar-1.0-b01-ea.jar")

from javax.management.remote import JMXServiceURL
from javax.management.remote import JMXConnector
from javax.management.remote import JMXConnectorFactory

jmx_url = JMXServiceURL("service:jmx:jmxmp://server:port/")
jmx_connector = JMXConnectorFactory.connect(jmx_url)