필자가 작성한 jmx 빈을 테스트하는 데 사용하는 Jmx 클라이언트가 있습니다. 다음은 클라이언트의 코드입니다 :Jmx client throwing InstanceNotFoundException
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8686/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
ObjectName mbeanName = new ObjectName("com.spmsoftware.processing.ping:type=ProcessingPing");
ProcessingPing mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName, ProcessingPing.class, true);
System.out.println("\nResult = " + mbeanProxy.ping(346, 0).getResultCode());
jmxc.close();
ProcessingPing는 모두가 종속성을 IntelliJ에있는 라이브러리에 존재합니다.
내 JMX 콩은 다음과 같습니다
Caused by: javax.management.InstanceNotFoundException: com.spmsoftware.processing.ping:type=ProcessingPing
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getClassLoaderFor(DefaultMBeanServerInterceptor.java:1444)
at com.sun.jmx.mbeanserver.JmxMBeanServer.getClassLoaderFor(JmxMBeanServer.java:1308)
at com.sun.enterprise.v3.admin.DynamicInterceptor.getClassLoaderFor(DynamicInterceptor.java:907)
at javax.management.remote.rmi.RMIConnectionImpl$4.run(RMIConnectionImpl.java:1346)
at java.security.AccessController.doPrivileged(Native Method)
at javax.management.remote.rmi.RMIConnectionImpl.getClassLoaderFor(RMIConnectionImpl.java:1342)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:795)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
at sun.rmi.transport.Transport$1.run(Transport.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:160)
at com.sun.jmx.remote.internal.PRef.invoke(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl_Stub.invoke(Unknown Source)
at javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.invoke(RMIConnector.java:1017)
Disconnected from the target VM, address: '127.0.0.1:56621', transport: 'socket'
at javax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandler.java:305)
... 2 more
I :
public interface ProcessingPing {
public PingResult ping(Integer environmentId, Integer timeout);
}
및
@Service("ProcessingPing")
@ManagedResource(description = "")
public class ProcessingPingImpl implements ProcessingPing {
private static final Integer DEFAULT_TIMEOUT = 5000;
@Autowired
private PingProcessService pingProcessService;
@Override
@ManagedOperation(description = "")
public PingResult ping(Integer environmentId, Integer timeout) {
return pingProcessService.run(environmentId, timeout);
}
}
, 클라이언트를 실행하는 경우, 내가 핑 메소드 (method)를 불러들이려고 예외가 jmx가 빈을 얻을 수있는 것처럼 보이지만 클래스의 실제 인스턴스가 아닌 이유를 이해하지 못한다. 나는 그것이 일종의 classpath 문제라고 추측하지만 그것을 발견하지 못했습니다. JConsole로 테스트 할 때, 괜찮습니다.
감사
그것은 MBean가 관리 빈을 검색 할 때 사용하는 오브젝트 이름과 다른 등록하는 데 사용되는 개체 이름과 같은
"processingPing"과 "ProcessingPing"을 의미합니까? 그래, 그건 오타였다. 그러나 나는 그것을 변경 한 후에 같은 예외를 얻는다. – sebi
사실 나는 전체 개체 이름 - "com.spmsoftware.processing.ping:type=ProcessingPing"을 의미했습니다. 이 객체 이름이 실제로 JConsole에서 볼 수있는 것과 동일한 지, 즉 MBeanInfo 섹션의 ObjectName 행을 확인할 수 있습니까? –
안녕하세요. 힌트를 보내 주셔서 감사합니다. 내 클라이언트를 사용하여 노출 된 모든 빈을 나열했으며 내 이름이 "com.spmsoftware : name = ProcessingPing, product = optymyze"라는 것을 보았습니다. ObjectName의 생성자에서 사용했고 매력으로 작동했습니다. – sebi