使用 JBoss 的 Mbean

Posted

技术标签:

【中文标题】使用 JBoss 的 Mbean【英文标题】:Mbeans with JBoss 【发布时间】:2011-04-18 01:54:35 【问题描述】:

我正在尝试调用部署在 JBoss 中的 MBean,但我遇到了这个异常:

java.rmi.UnmarshalException:解组参数错误;嵌套异常是: java.io.InvalidClassException:org.jboss.security.auth.callback.SecurityAssociationHandler; org.jboss.security.auth.callback.SecurityAssociationHandler;类对反序列化无效 在 sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:293) 在 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.io.InvalidClassException:org.jboss.security.auth.callback.SecurityAssociationHandler; org.jboss.security.auth.callback.SecurityAssociationHandler;类对反序列化无效 在 java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:713) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1733) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 在 java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947) 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 在 org.jboss.invocation.MarshalledInvocation.readExternal(MarshalledInvocation.java:665) 在 java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1792) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1751) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 在 sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306) 在 sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:290) ... 9 更多 引起:java.io.InvalidClassException:org.jboss.security.auth.callback.SecurityAssociationHandler;类对反序列化无效 在 java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:587) 在 java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583) 在 java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732) ... 22 更多

我用的是JBoss 5.1.0GA,客户端代码是

属性 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"); InitialContext ctx; ctx = new InitialContext(env); MBeanServerConnection 服务器 = (MBeanServerConnection)ctx.lookup("jmx/rmi/RMIAdaptor"); // 获取对 CacheMgmtInterceptor MBean 的引用 字符串 cache_service = "jboss:service=JNDIView"; ObjectName mgmt_name = new ObjectName(cache_service); System.out.println(server.getMBeanInfo(mgmt_name).getClassName()); 对象[] obj = 新字符串 [1]; obj[0]= new String("你好萨波佩佩"); 对象 temp = server.invoke(mgmt_name, "sayHello", obj, new String[]"String"); System.out.println(temp);

我可以访问抛出 JBOSS JNDI-Console,所以 MBean 正在工作。 提前致谢

【问题讨论】:

【参考方案1】:

好的,问题是 Eclipse 在类路径中执行客户端时没有 jboss 客户端 jar。

解决方案是在 Eclipse 的运行配置选项中的类路径选项卡中添加 jars 文件。

【讨论】:

以上是关于使用 JBoss 的 Mbean的主要内容,如果未能解决你的问题,请参考以下文章

休眠mbean

在 JBoss 中实现 CORBA 接口

不能使用jconsole连接到JBoss eap7.1

通告红帽JBoss Fuse及JBoss A-MQ所用Karaf远程代码执行漏洞 安全威胁

arthasArthas 查看 Mbean 的信息

MBean 描述符