1

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

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

这主要是有效的,但在一种情况下它不起作用。在我的应用程序中,由 导出的服务cluster_implementation可以被其他捆绑包通过服务注册表或声明式服务或 spring-dm 引用。组件的激活策略是delayed在第一次引用服务时激活它。

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

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

我使用的 OSGi 框架是 Equinox 3.6。

4

2 回答 2

0

我猜你的激活器和 spring dm 之间存在时间问题。Spring dm 使用和扩展器来监视带有 spring 上下文的包并初始化它们。这可能与激活器并行运行。老实说,我原以为激活器会首先运行,但似乎情况并非如此。

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

于 2012-09-28T06:39:07.937 回答
0

我想你一定有比你想象的更多的问题。任何已解析的捆绑包都可以访问资源,并且与 DS 完全无关。由于您的类已加载,您的代码可以从 JAR 加载。

这种行为似乎令人费解,并且可能是框架中的错误。当您使用片段时,我只能想象这会出错?但即使这样似乎也没有任何意义。您是否尝试过其他框架,Felix 具有非常好的诊断功能。

于 2012-09-28T07:24:23.087 回答