以编程方式启用远程jmx监控



我正在尝试通过JMX使我的核心java应用程序能够远程访问。然而,两个限制使它比应该的更难。

a)我不能自由地改变在linux盒子上启动应用程序的脚本。因此,我不能将任何"jmxremote"参数传递给jvm。

b)很可能我指定的远程端口(com.sun.management.jmxremote.port = xxxx)未打开,并且我无法修改脚本以尝试另一个打开的端口。我必须自动做这件事。

我试图通过编写一个类来绕过这些限制,该类将设置所有必需的jmxremote参数并找到一个"空闲"端口。

public class JmxRemoteConnectionHelper{
    @Override
    public void init( ) throws Exception{
        InetAddress address = InetAddress.getLocalHost();
        String ipAddress    = address.getHostAddress();
        String hostname     = address.getHostName();
        String port         = String.valueOf( getFreePort( ) );
        System.setProperty("java.rmi.server.hostname", ipAddress );
        System.setProperty("com.sun.management.jmxremote", "true" );
        System.setProperty("com.sun.management.jmxremote.authenticate", "false" );
        System.setProperty("com.sun.management.jmxremote.ssl", "false" );
        System.setProperty("com.sun.management.jmxremote.port", port  );
    }
    private final int getFreePort( ){
        **//seedPort is passed in the constructor**
        int freePort            = seedPort;
        ServerSocket sSocket    = null;
        for( int i=ZERO; i<PORT_SCAN_COUNTER; i++ ){
            try{
                freePort        = freePort + i;
                sSocket         = new ServerSocket( freePort );
               //FOUND a free port.             
                break;
            }catch( Exception e ){
                //Log
            }finally{
                if( sSocket != null ){
                    try{
                            sSocket.close();
                        sSocket = null;
                    }catch(Exception e ){
                    //Log
                    }
                }
            }
        }
        return freePort;
    }
 }
如下所示,I,然后通过spring初始化它。
<bean id="JmxRemoteConnection" class="JmxRemoteConnectionHelper" init-method="init" />
<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean" depends-on="JmxRemoteConnection" />   
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false" >
        <property name="assembler"      ref="assembler"/>
        <property name="namingStrategy" ref="namingStrategy"/>
        <property name="autodetect"     value="true"/>
        <property name="server"         ref="mbeanServer"/>
</bean>
<bean id="jmxAttributeSource" class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>
<bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
        <property name="attributeSource" ref="jmxAttributeSource"/>
</bean>
<bean id="namingStrategy" class="org.springframework.jmx.export.naming.MetadataNamingStrategy" lazy-init="true">
        <property name="attributeSource" ref="jmxAttributeSource"/>
</bean>
为了测试,我在我的windows机器上启动了这个应用程序。它启动正确。然而,当我在相同的盒子上打开JConsole并尝试通过"远程进程" (ip:port)连接时,我在底部得到"拒绝连接"消息。

我怀疑JMX代理没有看到我正在设置的任何远程系统属性。

我使用的是JDK 1.6

既然你已经在使用Spring,我想你应该看看是否使用ConnectorServerFactoryBean可以做你想做的事情。我从来没有启动过远程JMX服务器,但看起来这就是这个对象能为你做的。

查看在进程中启用jmx的答案:

是否有可能以编程方式启用远程jmx监控?

要找到一个空闲端口,只需将locaterregistry . createrregistry()包装在一个循环中,该循环使用新端口号重试,直到成功。当然,您必须将最终端口号传达给需要连接的任何设备。或者,在主机上运行jstatd应该可以发现它

相关内容

  • 没有找到相关文章

最新更新