从JBOSS 5.1远程访问JBOSS AS7.1上的EJB

时间:2013-11-22 06:58:11

标签: java-ee jboss7.x classloader ejb-3.0 jboss5.x

我在JBOSS 5.1上有一个企业应用程序。它需要远程访问部署在另一个JBOSS AS 7.0+实例上的EJB。 现在,AS 7.0+远程访问EJB协议已经发生变化,并且依赖于jboss-client.jar文件内容进行远程访问。

来自7.0+的jboss-client.jar中的一些类与5.1中可用的库(例如:org.jboss.logging.Logger)具有相同的结构。但是这两个类都有不同的方法。

从5.1调用远程EJB,如下所示

 final Hashtable jndiProperties = new Hashtable();
 jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");
 context = new InitialContext(jndiProperties);

 final String appName = "my-ear";
 final String moduleName = "my-ejb-1.0";
 final String distinctName = "";
 final String beanName = "ServiceBean";         
 final String viewClassName = "org.test.Service";
// let's do the lookup
 Service service = (Service) context.lookup("ejb:" + appName + "/"
                + moduleName + "/" + distinctName + "/" + beanName + "!"
                + viewClassName + "?stateful");

导致org.jboss.logging.Logger.getMessageLogger的NoSuchMethodException

这是因为JBOSS 5.1有一个名为'jboss-logging-spi.jar'的库,它包含与上面完全相同的类(Logger)。因此,JVM尝试在'jboss-logging-spi.jar'中定义的Logger类上调用getMessageLogger,而不是'jboss-client.jar'。

关于如何强制JVM寻找合适的类(jboss-client.jar中的Logger)的任何想法?

到目前为止,我尝试了这个选项:

解决从JBOSS 5.1上运行的应用程序调用JBOSS 7.0+上远程托管的EJB问题的任何想法?

1 个答案:

答案 0 :(得分:0)

为了解决类版本问题,第三个选项看起来是正确的方法。

我从您发布的链接中看到的是,可能you need要向Classloading元素添加属性:

parent-first="false"
  

parent-first(true / false) - 类加载器应该首先加载   你的战争/耳朵/罐子然后从父母的一切(如果是的话)   耳内的战争/罐子意味着耳朵,否则就是JBossAS)

另外,在处理Classloder配置,启用jboss classloder logging和使用JMX Console时,有一些工具可能很有用。

我希望这可以提供帮助。