Bir kabuk betiğinden JMX MBean yöntemini çağırma


98

Bir kabuk betiğinden bir JMX MBean yöntemini çağırmama izin verecek kitaplıklar var mı? Bazı işlemleri / yönetici komutlarını JMX aracılığıyla açığa çıkarıyoruz ve yöneticilerimizin JConsole veya VisualVM kullanmasını sağlayabiliriz, ancak bazı görevler otomasyona bırakılsa daha iyidir. Bu otomasyonda, çalışan sunucumuzda, tercihen bir kabuk betiğinden bir JMX MBean yöntemini çağırabilmek istiyoruz.

Yanıtlar:


106

Aşağıdaki komut satırı JMX yardımcı programları mevcuttur:

  1. jmxterm - en tam özellikli yardımcı program gibi görünüyor.
  2. cmdline-jmxclient - WebArchive projesinde kullanılan çok çıplak kemikler gibi görünüyor (ve 2006'dan beri hiçbir geliştirme görünmüyor)
  3. Harika komut dosyası ve JMX - gerçekten güçlü JMX işlevselliği sağlar, ancak harika ve diğer kitaplık kurulumları gerektirir.
  4. JManage komut satırı işlevi - (dezavantajı, komutları aracılığıyla proxy yapmak için çalışan bir JManage sunucusu gerektirmesidir)

Groovy JMX Örneği:

import java.lang.management.*
import javax.management.ObjectName
import javax.management.remote.JMXConnectorFactory as JmxFactory
import javax.management.remote.JMXServiceURL as JmxUrl

def serverUrl = 'service:jmx:rmi:///jndi/rmi://localhost:9003/jmxrmi'
String beanName = "com.webwars.gameplatform.data:type=udmdataloadsystem,id=0"
def server = JmxFactory.connect(new JmxUrl(serverUrl)).MBeanServerConnection
def dataSystem = new GroovyMBean(server, beanName)

println "Connected to:\n$dataSystem\n"

println "Executing jmxForceRefresh()"
dataSystem.jmxForceRefresh();

cmdline-jmxclient örneği:

Eğer varsa

  • MBean: com.company.data:type=datasystem,id=0

Bir Operasyon adı verilen:

  • jmxForceRefresh ()

Sonra basit bir bash betiği yazabilirsiniz ( cmdline-jmxclient-0.10.3.jar dosyasını indirdiğinizi ve betiğinizle aynı dizine koyduğunuzu varsayarak ):

#!/bin/bash

cmdLineJMXJar=./cmdline-jmxclient-0.10.3.jar
user=yourUser
password=yourPassword
jmxHost=localhost
port=9003

#No User and password so pass '-'
echo "Available Operations for com.company.data:type=datasystem,id=0"
java -jar ${cmdLineJMXJar} ${user}:${password} ${jmxHost}:${port} com.company.data:type=datasystem,id=0

echo "Executing XML update..."
java -jar ${cmdLineJMXJar} - ${jmxHost}:${port} com.company.data:type=datasystem,id=0 jmxForceRefresh


19

JMX Mbeans'i / proc fs ile benzer işlevselliğe sahip bir Linux FUSE dosya sistemi olarak ortaya çıkaran jmxfuse geliştirdim. JMX'e köprü olarak Jolokia'ya güveniyor . Nitelikler ve işlemler, okuma ve yazma için açığa çıkarılır.

http://code.google.com/p/jmxfuse/

Örneğin, bir özniteliği okumak için:

me@oddjob:jmx$ cd log4j/root/attributes
me@oddjob:jmx$ cat priority

bir öznitelik yazmak için:

me@oddjob:jmx$ echo "WARN" > priority

bir işlemi başlatmak için:

me@oddjob:jmx$ cd Catalina/none/none/WebModule/localhost/helloworld/operations/addParameter
me@oddjob:jmx$ echo "myParam myValue" > invoke

12

Syabru Nagios JMX eklentisi Nagios dan kullanılması amaçlanan, ancak nagios gerektirmez ve komut satırı kullanımı için çok uygundur:

~$ ./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:1099/JMXConnector --username myuser --password mypass -O java.lang:type=Memory -A HeapMemoryUsage -K used 
JMX OK - HeapMemoryUsage.used = 445012360 | 'HeapMemoryUsage used'=445012360;;;;

Bu harika ve çok hızlı. Jmxterm için 3 saniyeye karşılık bir değer döndürmek için yaklaşık 0,3 saniye
sivann

9

Muhtemelen bunu Java'da yazmak en kolayı

import javax.management.*;
import javax.management.remote.*;

public class JmxInvoke {

    public static void main(String... args) throws Exception {

        JMXConnectorFactory.connect(new JMXServiceURL(args[0]))
            .getMBeanServerConnection().invoke(new ObjectName(args[1]), args[2], new Object[]{}, new String[]{})


    }

}

Bu, tek bir .class'a derlenir ve sunucuda veya herhangi bir karmaşık maven paketinde bağımlılık gerektirmez.

ile ara

javac JmxInvoke.java
java -cp . JmxInvoke [url] [beanName] [method]

4

Biraz riskli, ancak JMX konsolundaki formdaki değerlerle, URL'sinden ve http kimlik doğrulamasından (gerekirse) bir curl POST komutu çalıştırabilirsiniz:

curl -s -X POST --user 'myuser:mypass'
  --data "action=invokeOp&name=App:service=ThisServiceOp&methodIndex=3&arg0=value1&arg1=value1&submit=Invoke"
  http://yourhost.domain.com/jmx-console/HtmlAdaptor

Dikkat: yöntem dizini yazılımdaki değişikliklerle değişebilir. Ve web formunun uygulanması değişebilir.

Yukarıdakiler, gerçekleştirmek istediğiniz işlem için JMX servis sayfasının kaynağına dayanmaktadır:

http://yourhost.domain.com/jmx-console/HtmlAdaptor?action=inspectMBean&name=YourJMXServiceName

Formun kaynağı:

form method="post" action="HtmlAdaptor">
   <input type="hidden" name="action" value="invokeOp">
   <input type="hidden" name="name" value="App:service=ThisServiceOp">
   <input type="hidden" name="methodIndex" value="3">
   <hr align='left' width='80'>
   <h4>void ThisOperation()</h4>
   <p>Operation exposed for management</p>
    <table cellspacing="2" cellpadding="2" border="1">
        <tr class="OperationHeader">
            <th>Param</th>
            <th>ParamType</th>
            <th>ParamValue</th>
            <th>ParamDescription</th>
        </tr>
        <tr>
            <td>p1</td>
           <td>java.lang.String</td>
         <td> 
            <input type="text" name="arg0">
         </td>
         <td>(no description)</td>
        </tr>
        <tr>
            <td>p2</td>
           <td>arg1Type</td>
         <td> 
            <input type="text" name="arg1">
         </td>
         <td>(no description)</td>
        </tr>
    </table>
    <input type="submit" value="Invoke">
</form>

Bunu Java'dan a kullanarak bu şekilde uyguladım HttpURLConnectionve çalıştığını doğrulayabilirim. (btw. submit=Invokegereksiz)
tom

nasıl çalıştığını tarif etmek mümkün mü? Demek istediğim, varsayılan olarak jmx kullanır rmive orada görüyorum http. Bu, sunucunun jmx isteklerini destekleyecek şekilde yapılandırılması gerektiği anlamına mı geliyor http?
Psychozoic

3

JManage'a bir göz atın . MBean yöntemlerini çalıştırabilir ve komut satırından öznitelikleri alabilir / ayarlayabilir .


Tek dezavantajı, komut satırı yardımcı programını kullanmak, JManage'ın JMX sunucularınıza proxy komutları vermek için çalışmasını gerektirir. Doğrudan JMX sunucusuna daha hafif bir yaklaşım tercih ederim.
Dougnukem

3

Ayrıca jmx4perl'e de bakmak isteyebilirsiniz . Uzak bir Java EE Sunucusunun MBean'lerine java'sız erişim sağlar. Ancak, bir JSON yükü ile HTTP üzerinden dinlendirici bir JMX Erişimi sağlayan küçük bir aracı sunucu uygulamasının hedef platforma yüklenmesi gerekir. (Sürüm 0.50, bir JSR-160 proxy uygulayarak aracısız bir mod ekleyecektir).

Avantajlar, yerel bir java JVM'yi başlatmaya kıyasla hızlı başlatma süreleri ve kullanım kolaylığıdır. jmx4perl, kendi komut dosyalarınızda kolayca kullanabileceğiniz eksiksiz bir Perl modülleri setiyle birlikte gelir:

use JMX::Jmx4Perl;
use JMX::Jmx4Perl::Alias;   # Import certains aliases for MBeans

print "Memory Used: ",
      JMX::Jmx4Perl
          ->new(url => "http://localhost:8080/j4p")
          ->get_attribute(MEMORY_HEAP_USED);

Ayrıca genel MBean / Nitelik / İşlem kombinasyonları için takma ad da kullanabilirsiniz (örneğin çoğu MXBeans için). Ek özellikler için (Nagios-Plugin, karmaşık öznitelik türlerine XPath benzeri erişim, ...), lütfen jmx4perl belgelerine bakın.


1

@Dougnukem cevap bana çok yardımcı oldu. Groovy yaklaşımını kullandım (groovy 2.3.3 kullanarak).

Dougnukem kodunda bazı değişiklikler yaptım. Bu, Java 7 ile çalışacak ve her 10 saniyede bir standart çıktıya iki öznitelik yazdıracaktır.

        package com.my.company.jmx
        import groovy.util.GroovyMBean;
        import javax.management.remote.JMXServiceURL
        import javax.management.remote.JMXConnectorFactory
        import java.lang.management.*

            class Monitor {
                static main(args) {
                    def serverUrl = 'service:jmx:rmi:///jndi/rmi://localhost:5019/jmxrmi'
                    String beanName = "Catalina:type=DataSource,class=javax.sql.DataSource,name=\"jdbc/CommonDB\""
                    println  "numIdle,numActive"

                    while(1){
                        def server = JMXConnectorFactory.connect(new JMXServiceURL(serverUrl))
                       //make sure to reconnect in case the jvm was restrated 
                        server.connect()
                        GroovyMBean mbean = new GroovyMBean(server.MBeanServerConnection, beanName)
                        println  "${mbean.numIdle},${mbean.numActive}"
                        server.close()
                        sleep(10000)
                    }

                }
            }

Bu kodu maven-compiler-eklentisini kullanarak bir kavanozda derleyin, böylece yalnızca groovy-all.jar dosyasını mükemmel bir şekilde yüklemenize gerek kalmaz. Aşağıda ilgili eklenti tanımı ve bağımlılığı bulunmaktadır.

   <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <compilerId>groovy-eclipse-compiler</compilerId>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-eclipse-compiler</artifactId>
                        <version>2.8.0-01</version>
                    </dependency>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-eclipse-batch</artifactId>
                        <version>2.3.4-01</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.3</version>
        </dependency>
    </dependencies>

Bir sopa veya kabuk ile sarın ve verileri standart çıktıya yazdıracaktır.


0

Bash benzeri ortam hakkında emin değilim. Uzak sunucuda MBean'lerinizi çağıran Java'da (program bağımsız değişkenleriyle) bazı basit sarmalayıcı programları deneyebilirsiniz. Daha sonra bu sarmalayıcıları kabuk betiğinden çağırabilirsiniz.

Python veya Perl gibi bir şey kullanabiliyorsanız, JMX işlemlerini web hizmetleri üzerinden göstermenize olanak tanıyan JSR-262 ile ilgilenebilirsiniz . Bunun Java 7'ye dahil edilmesi planlanmıştır, ancak referans uygulamasının bir sürüm adayını kullanabilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.