在OSGi包激活期间打开文件

时间:2012-09-27 15:59:39

标签: osgi equinox spring-dm

我已经使用声明性服务(DS)组件定义定义了一个OSGi包(cluster_implementation),指定了一个导出的服务,一个激活方法和一个停用方法。

在Activate方法的主体中,我需要访问一个文件系统中不存在的文件,但它捆绑在OSGi包本身中。 在activate方法期间,使用InputStream将文件内容检索为java.lang.ClassLoader:getResourceAsStream

这大部分都有效,但有一种情况不起作用。在我的应用程序中,cluster_implementation导出的服务可以通过Service Registry或Declarative Service或spring-dm引用其他bundle。组件的激活策略为delayed,因此在第一次引用服务时会激活它。

现在,如果由于声明服务组件的引用而发生激活,则文件内容可以正常读取,如果由于spring-dm组件需要服务而发生激活,则InputStream为资源是NULL! 现在我通过在组件属性中设置immediate="true"来立即激活组件来解决问题,但我的请求是:

  • 是否允许在DS组件激活期间以Stream的形式获取资源内容?
  • 如果这是合法的,为什么通过spring-dm激活可能会导致资源无法访问Stream? BTW资源就在那里 - 如果我做Bundle.findEntries我就能看到它!

我正在使用的OSGi框架是Equinox 3.6。

2 个答案:

答案 0 :(得分:0)

我猜你的激活器和弹簧dm之间存在时间问题。 Spring dm使用和扩展器来查看具有spring上下文的bundle并初始化它们。这可能与激活器并行运行。老实说,我原本预计激活器会先运行,但事实并非如此。

要解决此问题,您可以确保文件是由首先访问文件的一方创建的,但要小心使其线程安全。

答案 1 :(得分:0)

我认为你必须遇到另一个问题。任何已解析的捆绑包都可以访问资源,这与DS完全无关。由于您的类已加载,因此可以从JAR加载代码。

行为似乎令人费解,可能是框架中的错误。我只能想象你使用碎片时会出错吗?但即使这样也没有意义。你有没有尝试过另一个框架,Felix有很好的诊断功能。