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 不同,且是不能兼容的,所以就会遇到我的问题,仅此抛砖引玉,希望给遇到同样类似问题的同学一些意见。