【问题标题】:Declarative services component both satisfied and unsatisfied满足和不满足的声明式服务组件
【发布时间】:2014-12-12 13:49:31
【问题描述】:

我正在开发一个基于 OSGI 的系统,它使用声明式服务来定义组件。但是,当从 Eclipse 运行它时,我的组件之一未初始化。当我使用简单的控制台命令调查问题时,我得到以下输出(带有一些小混淆):

osgi> component 51
    Component[
    name = com.e.location.view
    activate = activate
    deactivate = deactivate
    modified = 
    configuration-policy = optional
    factory = null
    autoenable = true
    immediate = false
    implementation = com.e.location.view.LocationViewContribution
    state = Unsatisfied
    properties = 
    serviceFactory = false
    serviceInterface = [com.e.model.ViewContribution]
    references = {
        Reference[name = SpecificationProvider, interface = com.e.SpecificationProvider, policy = static, cardinality = 1..1, target = null, bind = setSpecificationProvider, unbind = null]
    }
    located in bundle = com.e.location.view_1.0.0.SNAPSHOT [107]
]
Dynamic information :
  The component is satisfied
  All component references are satisfied
  Component configurations :
    Configuration properties:
      component.name = com.e.location.view
      component.id = 55
      objectClass = String[com.e.model.ViewContribution]
    Instances:

所以组件有state = Unsatisfied,但动态信息表明组件满足,其组件引用也满足。

谁能解释一下?为什么我的组件没有初始化?

更新:显然,为组件设置immedate="true" 修复了初始化问题。 osgi 命令仍然有state = Unsatisfied。有人知道为什么吗?

【问题讨论】:

    标签: java osgi equinox declarative-services


    【解决方案1】:

    我们在以下情况下遇到过类似问题:

    • 组件的activate方法抛出异常(见日志)
    • 组件的activate方法没有返回(见线程转储)
      • 激活中的无限循环(或 JVM 增强递归)
      • 死锁

    如果您在 equinox 中并且没有安装将 LogEvents 转发到日志文件/控制台的捆绑包,请不要忘记检查配置目录,Equinox 将日志文件放置在该目录中以获取错误消息。

    【讨论】:

    • 感谢您的回答。我还没有定义激活方法。这也会导致问题吗?
    • 您不必拥有激活方法。但是,如果组件 xml 中列出了 activate 方法,那么它应该在类中可用。你检查错误日志了吗?
    • 我检查了错误日志,找不到任何东西。我更新了我的问题
    【解决方案2】:

    请记住,组件的构造函数不能有参数。

    另外,在<scr:component> 标记中使用enabled="true" immediate="true" 属性强制启用。

    【讨论】:

    • 我确保他们有这样的构造函数。此外,如果组件没有这样的构造函数,您将在日志中看到异常。但我在这里没有得到那个
    • 我已经用另一种可能的解决方案更新了我的答案:)
    • 感谢您的帮助,但我已经在我的问题中评论了 immediate="true"。你知道为什么 shell 命令仍然像我在问题末尾问的那样说组件状态=未初始化吗?
    • 如果您键入“ls”命令,您会看到您的组件“已启用”,不是吗? (可能是的,因为它具有 autoenabled=true 属性,但可能某些东西没有启用您的组件,因此它没有被初始化)。
    • 组件已启用。事实上,它工作正常。我的问题是为什么“组件”命令仍然显示为“状态=不满意”。
    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2013-10-27
    • 2016-08-10
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    相关资源
    最近更新 更多