0

JBoss の NotificationListener で問題が発生しています。

JBoss に MBean があり、それらのメソッドを接続して呼び出すことができます。しかし、通知を追加しようとすると、次の例外が発生します。

org.jboss.invocation.JBossLazyUnmarshallingException: getArguments が失敗しました
    org.jboss.invocation.MarshalledInvocation.getArguments(MarshalledInvocation.java:513) で
    org.jboss.jmx.connector.invoker.InvokerAdaptorService.invoke(InvokerAdaptorService.java:230) で
    sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) で
    java.lang.reflect.Method.invoke(Method.java:597) で
    org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157) で
    org.jboss.mx.server.Invocation.dispatch(Invocation.java:96) で
    org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:138) で
    org.jboss.mx.server.Invocation.invoke(Invocation.java:90) で
    org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:140) で
    org.jboss.jmx.connector.invoker.SerializableInterceptor.invoke(SerializableInterceptor.java:74) で
    org.jboss.mx.server.Invocation.invoke(Invocation.java:90) で
    org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264) で
    org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668) で
    org.jboss.invocation.jrmp.server.JRMPProxyFactory.invoke(JRMPProxyFactory.java:180) で
    sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) で
    java.lang.reflect.Method.invoke(Method.java:597) で
    org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157) で
    org.jboss.mx.server.Invocation.dispatch(Invocation.java:96) で
    org.jboss.mx.server.Invocation.invoke(Invocation.java:88) で
    org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264) で
    org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668) で
    org.jboss.invocation.jrmp.server.JRMPInvoker$MBeanServerAction.invoke(JRMPInvoker.java:855) で
    org.jboss.invocation.jrmp.server.JRMPInvoker.invoke(JRMPInvoker.java:422) で
    sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) で
    java.lang.reflect.Method.invoke(Method.java:597) で
    sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305) で
    sun.rmi.transport.Transport$1.run(Transport.java:159) で
    java.security.AccessController.doPrivileged(ネイティブメソッド)で
    sun.rmi.transport.Transport.serviceCall(Transport.java:155) で
    sun.rmi.transport.tcp.TCPTransport.handleMessages (TCPTransport.java:535) で
    sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) で
    sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) で
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) で
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) で
    java.lang.Thread.run(Thread.java:637) で
原因: java.lang.ClassNotFoundException: ar.com.cube3.test.msn.MyListener
    java.net.URLClassLoader$1.run(URLClassLoader.java:202) で
    java.security.AccessController.doPrivileged(ネイティブメソッド)で
    java.net.URLClassLoader.findClass(URLClassLoader.java:190) で
    java.lang.ClassLoader.loadClass(ClassLoader.java:307) で
    sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) で
    java.lang.ClassLoader.loadClass(ClassLoader.java:248) で
    at java.lang.Class.forName0(ネイティブメソッド)
    java.lang.Class.forName(Class.java:247) で
    org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:292) で
    org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:1119) で
    org.jboss.classloader.spi.base.BaseClassLoader.loadClassFromDomain(BaseClassLoader.java:798) で
    org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:441) で
    java.lang.ClassLoader.loadClass(ClassLoader.java:248) で
    at java.lang.Class.forName0(ネイティブメソッド)
    java.lang.Class.forName(Class.java:247) で
    java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:604) で
    org.jboss.invocation.MarshalledValueInputStream.resolveClass(MarshalledValueInputStream.java:109) で
    java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575) で
    java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496) で
    java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:1732) で
    java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1329) で
    java.io.ObjectInputStream.readArray (ObjectInputStream.java:1667) で
    java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1323) で
    java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) で
    org.jboss.invocation.MarshalledValue.get(MarshalledValue.java:91) で
    org.jboss.invocation.MarshalledInvocation.getArguments(MarshalledInvocation.java:509) で
    ... 40以上

MBean フォームを JBOSS 外部のクライアントから呼び出しています

メインのコードは次のとおりです。

プロパティ env = new Properties();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
            env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
            env.put(Context.PROVIDER_URL, "jnp://localhost:1099");

            初期コンテキスト ctx;
            ctx = 新しい InitialContext(env);

            MBeanServerConnection サーバー = (MBeanServerConnection)ctx.lookup("jmx/invoker/RMIAdaptor");


               // CacheMgmtInterceptor MBean への参照を取得します

              String cache_service = "ar.com.cube3.framework.modulos.msn:jndiName=msnControl,service=MSNControlAcceso";
              //String cache_service = "jboss:service=JNDIView";
               ObjectName mgmt_name = new ObjectName(cache_service);
///             
               server.addNotificationListener(mgmt_name,(NotificationListener) new MyListener(), new NotificationFilter() {


                private static final long serialVersionUID = 6404657810887052083L;

                public boolean isNotificationEnabled(通知通知) {
                    // TODO 自動生成メソッド スタブ
                    true を返します。
                }
            }、 ヌル);

            オブジェクト obj[]= {"テスト"};
            オブジェクト temp = server.invoke(mgmt_name, "registrarMsnMessenger", obj, new String[]{String.class.getName()});
            System.out.println(temp);
        キャッチ(例外e){
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }

そして、notificationListener の実装:

java.io.Serializable をインポートします。

import javax.management.Notification;
import javax.management.NotificationListener;

public class MyListener は NotificationListener、Serializable を実装します{


    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public void handleNotification(通知通知、オブジェクトのハンドバック) {
        System.out.println("objecto" + notification.getMessage());

    }
}

前もって感謝します。アンドレス。

4

2 に答える 2

1

このwikiページには、この件に関する情報もあります

http://community.jboss.org/wiki/HowDoIAddANotificationListenerToARemoteMBeanServer

于 2011-02-28T10:30:27.410 に答える
1

問題は、JBoss サーバーのクラスパスにリスナー実装 ( ar.com.cube3.test.msn.MyListener ) がないため、インスタンス化してリスナーとして登録できないことです。すべてのカスタム クラス (リスナーなど) を jar にパッケージ化し、その jar をディレクトリ[jboss-home]/server/[server-name]/lib に配置します。

于 2010-10-17T20:37:17.740 に答える