1、问题描述
由于项目的需要,需要jboss6访问不同应用服务提供的远程ejb,但在初始化jndi时会报以下错误:
javax.naming.NamingException: JBAS011843: Failed instantiate InitialContextFactory org.jboss.naming.remote.client.InitialContextFactory from classloader ModuleClassLoader 该错误在boss6上应该很常见
2、解决方案分析
InitialContextFactory 无法初始化,查询了相关jboss6的开发文档,jboss6访问远程ejb的方式与jboss4不同,jboss4 采用以下代码实现:
Properties properties = new Properties();
// properties.setProperty("java.naming.factory.initial", JNDIWorkerHelper.JNDI_INITIAL);
// properties.setProperty("java.naming.factory.url.pkg", JNDIWorkerHelper.JNDI_PKG);
// properties.setProperty("java.naming.provider.url", jndiURL);
// logger.info(properties);
// JndiWorker.getInstance(properties);使用JndiWorker 初始化,但该方式在jboss6上不使用。那jboss6如何使用,请看下面的步骤:
1)查看相关文档发现,在jboss6上我们必须添加远程ejb的依赖如下
<dependency>
<groupId>org.jboss.jboss-eap.client</groupId>
<artifactId>jboss-client</artifactId>
<version>6.2.0.GA</version>
<scope>provided</scope>
</dependency>2) 初始化jndi
Properties jndiProps = new Properties();
// jndiProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
jndiProps.put(Context.INITIAL_CONTEXT_FACTORY, org.jboss.naming.remote.client.InitialContextFactory.class.getName());
jndiProps.put(Context.PROVIDER_URL, jndiURL);
// jndiProps.put(Context.SECURITY_PRINCIPAL, "myusername");
// jndiProps.put(Context.SECURITY_CREDENTIALS, "mypassword");
// jndiProps.put("jboss.naming.client.ejb.context", true);
Context ctx =new InitialContext(jndiProps);使用Context 来lookup 远程ejb service
3) 需要在jboss-deployment-structure.xml 添加模块声明
<module name="org.jboss.remote-naming" />模块这里仅列出系统需要的模块,对于远程ejb相关的jar包与应用业务相关,需要哪些jar就需要在这个module里添加声明。
做完上面的步骤才能真正的访问ejb service
3、总结
在jboss6上调用远程ejb 与jboss4 不同,且是不能兼容的,所以就会遇到我的问题,仅此抛砖引玉,希望给遇到同样类似问题的同学一些意见。
本文解决JBoss6访问远程EJB时出现的InitialContextFactory初始化失败的问题,介绍正确的依赖添加方法及JNDI初始化过程,并提供jboss-deployment-structure.xml配置示例。
3096

被折叠的 条评论
为什么被折叠?



