声明性服务组件既满意又不满意

时间:2014-12-12 13:49:31

标签: java osgi equinox declarative-services

我正在开发一个基于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。有谁知道为什么?

2 个答案:

答案 0 :(得分:3)

我们遇到类似的问题:

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

如果你在equinox并且没有安装将LogEvents转发到日志文件/控制台的软件包,请不要忘记检查配置目录,其中equinox将日志文件放入错误消息中。

答案 1 :(得分:0)

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

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