我已经使用声明性服务(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"
来立即激活组件来解决问题,但我的请求是:
Bundle.findEntries
我就能看到它!我正在使用的OSGi框架是Equinox 3.6。
答案 0 :(得分:0)
我猜你的激活器和弹簧dm之间存在时间问题。 Spring dm使用和扩展器来查看具有spring上下文的bundle并初始化它们。这可能与激活器并行运行。老实说,我原本预计激活器会先运行,但事实并非如此。
要解决此问题,您可以确保文件是由首先访问文件的一方创建的,但要小心使其线程安全。
答案 1 :(得分:0)
我认为你必须遇到另一个问题。任何已解析的捆绑包都可以访问资源,这与DS完全无关。由于您的类已加载,因此可以从JAR加载代码。
行为似乎令人费解,可能是框架中的错误。我只能想象你使用碎片时会出错吗?但即使这样也没有意义。你有没有尝试过另一个框架,Felix有很好的诊断功能。