5

作成したjmxBeanをテストするために使用するJmxクライアントがあります。クライアントのコードは次のとおりです。

    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のライブラリに存在します。

私のjmxBeanは次のとおりです。

    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);
        }            
    }

クライアントを実行しているときに、pingメソッドを呼び出そうとすると例外が発生します。

    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

jmxがBeanを取得できるように見える理由はわかりませんが、クラスの実際のインスタンスはわかりません。クラスパスの問題のようなものだと思いますが、見つかりませんでした。余談ですが、JConsoleでテストする場合は、正常に機能します。

ありがとう

4

3 に答える 3

8

MBeanの登録に使用されるオブジェクト名が、管理対象Beanを取得しようとするときに使用するオブジェクト名とは異なるようです。

JConsoleでオブジェクト名を確認してみてください。

于 2013-03-12T13:09:27.927 に答える
0

定義されたmbeanのオブジェクト名は、JMXクライアントコードで提供しているものとは異なるようです。オブジェクト名は、以下のクラスのようにJavaクラスで定義したものと完全に一致する必要があります。mbeanはspringを使用して公開されます。

例-クラス@ManagedResource(objectName = "com.spmsoftware.processing.ping:type=ProcessingPing"の上に書かれた以下の行

または、jconsole.exeをチェックインしてタブmbeansに移動し、左側のペインでmbeanの名前を確認することもできます。

于 2014-06-13T10:59:14.330 に答える
0

私の場合、Bean(この場合はProcessingPingImpl)を作成するのを忘れました。

アノテーションソリューション:@ComponentBeanと@ComponentScan("com.company")@Configuration-Objectで使用できます。(http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch06s02.htmlを参照してください)

または、次のように@Configuration-Objectで直接Beanを作成します。

@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" />
于 2016-05-13T14:49:56.280 に答える