2013-03-12 3 views
4

필자가 작성한 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가 관리 빈을 검색 할 때 사용하는 오브젝트 이름과 다른 등록하는 데 사용되는 개체 이름과 같은

답변

7

.

JConsole에서 개체 이름을 확인하십시오.

+0

"processingPing"과 "ProcessingPing"을 의미합니까? 그래, 그건 오타였다. 그러나 나는 그것을 변경 한 후에 같은 예외를 얻는다. – sebi

+3

사실 나는 전체 개체 이름 - "com.spmsoftware.processing.ping:type=ProcessingPing"을 의미했습니다. 이 객체 이름이 실제로 JConsole에서 볼 수있는 것과 동일한 지, 즉 MBeanInfo 섹션의 ObjectName 행을 확인할 수 있습니까? –

+0

안녕하세요. 힌트를 보내 주셔서 감사합니다. 내 클라이언트를 사용하여 노출 된 모든 빈을 나열했으며 내 이름이 "com.spmsoftware : name = ProcessingPing, product = optymyze"라는 것을 보았습니다. ObjectName의 생성자에서 사용했고 매력으로 작동했습니다. – sebi

0

정의 된 mbean의 objectname이 JMX 클라이언트 코드에서 제공하는 것과 다릅니다. 개체 이름은 아래 클래스 m과 같이 Java 클래스에서 정의한 것과 정확히 일치해야합니다. bean은 spring을 사용하여 노출됩니다.

예 - 클래스 @ManagedResource의 상단 (개체 이름은 =

"com.spmsoftware.processing.ping:type=ProcessingPing"또는 당신은 또한 jconsole.exe에서 확인 탭으로 이동 할 수 있습니다에 쓰여진 아래 라인 . MBean의 왼쪽 창에서 MBean의 이름을 확인 내 경우

0

나는 (이 경우 ProcessingPingImpl에서) 빈을 생성하는 것을 잊었다

주석 솔루션을 :. 당신은에 콩 및 @ComponentScan("com.company")@Component을 사용할 수 있습니다 @ Configuration-Object. 16,

(http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch06s02.html 참조) 또는이 같은 @ 구성 객체에서 직접 콩을 만듭니다

@Bean 
public ProcessingPing processingPing(){ 
    return new ProcessingPingImpl(); 
} 

XML 솔루션 :

<context:component-scan base-package="com.company" /> 

(https://github.com/spring-by-example/spring-by-example/blob/master/enterprise/spring-jmx/src/test/resources/org/springbyexample/jmx/JmxTest-context.xml에서 참조)

을 또는 구성 요소 스캔없이 :

<bean id="processingPing" class="com.company.ProcessingPingImpl" />