【问题标题】:Opening a file during OSGi bundle activation在 OSGi 捆绑激活期间打开文件
【发布时间】:2012-09-27 15:59:39
【问题描述】:

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

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

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

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

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

我使用的 OSGi 框架是 Equinox 3.6。

【问题讨论】:

    标签: osgi equinox spring-dm


    【解决方案1】:

    我认为你一定有另一个问题,而不是你想象的。任何已解析的捆绑包都可以访问资源,并且与 DS 完全无关。由于您的类已加载,因此您的代码可以从 JAR 中加载。

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

    【讨论】:

    • Peter,感谢您的回复,确实您是对的,我只是对这个问题进行了更多的故障排除,如果在我遇到故障的同一位置,我使用 this.getClass() 检索资源.getClassLoader().getResourceAsStream("/config/infinispan-config.xml");我转储了我可以看到的所有内容。 API 失败是 Infinispan 包(修订版 5.1.4)中 DefaultCacheManager 的一部分,并且似乎无法正确查找文件。我应该做更多的调试,我不太确定在激活器中应该进行哪些正确的操作。谢谢!
    【解决方案2】:

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

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

    【讨论】:

    • Chirstian,感谢您的回复,这似乎不是 spring-dm 和激活器之间的竞争条件,而是正在使用的库中的一个普通错误。即使 API 仍然失败,使用正确的 API 打开资源也可以让我获得正确的内容。谢谢你的帮助。
    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2014-03-02
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多