답변:
다음 명령 줄 JMX 유틸리티를 사용할 수 있습니다.
Groovy JMX 예제 :
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 예 :
당신이
다음과 같은 작업이 있습니다.
그런 다음 간단한 bash 스크립트를 작성할 수 있습니다 ( cmdline-jmxclient-0.10.3.jar 를 다운로드 하고 스크립트와 동일한 디렉토리에 배치 한다고 가정 ).
#!/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
나는 JMX Mbean을 / proc fs와 유사한 기능을 가진 Linux FUSE 파일 시스템으로 노출하는 jmxfuse를 개발했습니다. JMX의 다리로 Jolokia에 의존합니다 . 읽기 및 쓰기를 위해 속성 및 작업이 노출됩니다.
http://code.google.com/p/jmxfuse/
예를 들어, 속성을 읽으려면 :
me@oddjob:jmx$ cd log4j/root/attributes
me@oddjob:jmx$ cat priority
속성을 작성하려면 :
me@oddjob:jmx$ echo "WARN" > priority
작업을 호출하려면 :
me@oddjob:jmx$ cd Catalina/none/none/WebModule/localhost/helloworld/operations/addParameter
me@oddjob:jmx$ echo "myParam myValue" > invoke
Syabru의 Nagios JMX 플러그인 의 Nagios에서 사용하기위한 것입니다,하지만 Nagios는 필요하지 않습니다 및 명령 줄 사용하기에 매우 편리합니다 :
~$ ./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;;;;
잠재적으로 Java로 작성하는 것이 가장 쉽습니다.
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[]{})
}
}
이것은 단일 .class로 컴파일되며 서버 또는 복잡한 maven 패키징에 대한 종속성이 필요하지 않습니다.
그것을 불러
javac JmxInvoke.java
java -cp . JmxInvoke [url] [beanName] [method]
약간 위험하지만 JMX 콘솔의 양식 값, URL 및 http 인증 (필요한 경우)을 사용하여 curl POST 명령을 실행할 수 있습니다.
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
주의 : 분석법 색인은 소프트웨어 변경에 따라 변경 될 수 있습니다. 그리고 웹 양식의 구현이 변경 될 수 있습니다.
위는 수행하려는 작업에 대한 JMX 서비스 페이지의 소스를 기반으로합니다.
http://yourhost.domain.com/jmx-console/HtmlAdaptor?action=inspectMBean&name=YourJMXServiceName
양식 출처 :
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>
HttpURLConnection
했으며 작동하는지 확인할 수 있습니다. (btw. submit=Invoke
불필요)
rmi
하고 거기에 http
. 서버가 jmx 요청을 지원하도록 구성되어야 함을 의미합니까 http
?
jmx4perl을 살펴볼 수도 있습니다 . 원격 Java EE 서버의 MBean에 대한 Java없는 액세스를 제공합니다. 그러나 JSON 페이로드와 함께 HTTP를 통해 안정적인 JMX 액세스를 제공하는 작은 에이전트 서블릿을 대상 플랫폼에 설치해야합니다. (버전 0.50은 JSR-160 프록시를 구현하여 에이전트없는 모드를 추가합니다.)
장점은 로컬 Java JVM을 시작하는 것에 비해 시작 시간이 빠르고 사용하기 쉽다는 것입니다. jmx4perl은 자신의 스크립트에서 쉽게 사용할 수있는 전체 Perl 모듈 세트와 함께 제공됩니다.
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);
일반적인 MBean / 속성 / 연산 콤보 (예 : 대부분의 MXBean)에 별칭을 사용할 수도 있습니다. 추가 기능 (Nagios-Plugin, 복잡한 속성 유형에 대한 XPath와 유사한 액세스, ...)에 대해서는 jmx4perl의 문서를 참조하십시오.
@Dougnukem 대답은 나를 많이 도왔습니다. 나는 Groovy 접근 방식을 취했습니다 (groovy 2.3.3 사용).
Dougnukem 코드를 약간 변경했습니다. 이것은 Java 7에서 작동하며 10 초마다 두 개의 속성을 stdout에 인쇄합니다.
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)
}
}
}
maven-compiler-plugin을 사용하여이 코드를 jar로 컴파일하면 groovy-all.jar 만 그루비 설치가 필요하지 않습니다. 다음은 관련 플러그인 정의 및 종속성입니다.
<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>
박쥐 또는 셸로 감싸면 데이터가 stdout에 인쇄됩니다.