2012-12-03 24 views
13

OSGI Enterprise Release 5 specification的第126章提到的兼容性:OSGI JNDI是否允许与来自非OSGI代码的JNDI调用共存?

“支持的Java SE和Java EE客户端使用传统的JNDI编程模型。”

和使用OSGI-不知道代码:

“那不知道的OSGi的客户端和JNDI上下文提供使用静态方法来连接到 JRE JNDI实现InitialContext类提供了一个访问。从供应商和 提供商上下文中使用静态NamingManager方法来做对象转换并找到URL上下文。 这种传统的模式是不知道的OSGi的,因此如果 这种缺乏OSGi的意识造成的后果进行管理才能可靠地使用。 “

但如果本文仅适用于“传统”代码OSGi包内执行,或者也OSGi容器外部的代码,目前尚不清楚对我来说,在一个场景中˚F前在OSGi容器嵌入一个应用程序。

在嵌入的情况下,可能有两外侧以及执行JNDI呼叫的OSGI容器内的应用程序代码,并且当它们在相同的JVM执行它们将共享JNDI实现。

问题:应该在嵌入式OSGI容器中的OSGI JNDI实现运行允许在容器外OSGI-不知道代码来执行它的JNDI调用像往常一样,或者说是“OSGI意识”需要做一些移植?

使用Apache Karaf 2.3.0(使用Apache Aries JNDI 1.0.0)尝试一下,因为Apache Aries需要JNDI客户端调用来源于OSGI包,所以这似乎不起作用。
部分堆栈跟踪:

javax.naming.NoInitialContextException: The calling code's BundleContext could not be determined. 
    at org.apache.aries.jndi.OSGiInitialContextFactoryBuilder.getInitialContext(OSGiInitialContextFactoryBuilder.java:46) 
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684) 
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307) 
    at javax.naming.InitialContext.init(InitialContext.java:242) 
    at javax.naming.InitialContext.<init>(InitialContext.java:192) 

问:这是正确的行为,或者是有规范我可以引用的部分由这种限制违反了?

回答

0

我不知道如果我理解正确的问题...... JNDI是一个服务提供者接口,它需要一些基础的实现与运行。所有你需要做的就是配置它的OSGI容器。

我会建议建立由JNDI所需要的全部罐子一束,并导出所有的包。然后使用Dynamic-Import:*来使用它。它适用于我们的情况(带有用于EJB调用的JBoss 5 JNDI的Eclipse RCP应用程序)。

但是,如果您需要在容器内部和外部使用JNDI并且您不想与Classloading发生冲突,那么我会建议将所有jar添加到应用程序类路径中。这样它应该可以在整个应用程序中访问。

1

我想Weblogic上部署的Apache Karaf时遇到了同样的问题。 我们通过一个servlet桥使用karaf - 一个战争部署在weblogic中,它将所有http请求桥接到karaf。

我与WebLogic上以下运行的应用程序:

  1. APP1(使用JNDI)
  2. APP 2
  3. karaf桥(桥请求Karaf)

一旦作为karaf开始内部Karaf白羊座JNDI实现运行设置里面javax.naming.NamingManager InitialContextFactoryBuilder到它自己的实现。 NamingManager拥有一个静态参考初始上下文工厂生成,故取其执行,而不管其在OSGi环境中运行,是否设置此静态引用成为JNDI提供商。

在我的情况下,当APP1(非OSGI)试图做一个新的InitialContext,白羊座JNDI将尝试使用的BundleContext并未能解决。

我固定此使用一些非常难看黑客所涉及从JRE提取javax.naming包和安装它作为karaf束。

所以回答你的问题:我认为这个问题是真的在JRE和如何JNDI查找管理不OSGI。

0

Apache Aries似乎已经想到了这一点,并提供了JRE初始上下文工厂生成器(org.apache.aries.jndi.JREInitialContextFactoryBuilder)的实现,它似乎工作。然而,为了这个工作,我必须更改注册JVM宽初始上下文工厂构建器的Aries代码。可能有另一种(也可能更好)的方式来实现这一点。但是,这似乎工作。

此外,请注意问题不会停留在NamingManager中设置的InitialContextFactoryBuilder。 ObjectFactoryBuilder出现了同样的问题(它在NamingManager中又被设置为JVM宽)。根据您尝试连接的JNDI提供程序,您可能还需要更改Aries JNDI代码的这一部分。例如对于TIBCO EMS的JNDI连接,我不得不从白羊座调整为OSGiObjectFactoryBuilder代码返回一个特定的Tibco的ObjectFactory。这可以使用Context.OBJECT_FACTORIES环境值轻松地推广。

我已经提出了一个JIRA为同 - https://issues.apache.org/jira/browse/ARIES-1127