代码之家  ›  专栏  ›  技术社区  ›  Stefanie Deutschmann

OSGi声明性服务处于活动状态,但未调用bind()

  •  2
  • Stefanie Deutschmann  · 技术社区  · 7 年前

    FooService 这需要 FooManagerService (1..1 static) 这个 FooManagerService 参考 食品服务 (0..n dynamic) . 食品服务 变得可用,它注册( bind() 食品管理服务 ,以便 食品管理服务 系统中的实现。

    食品服务 activate() 食品管理服务 ( 方法)。如果我禁用并启用 食品服务 在OSGi控制台上手动执行,它由 .

    FooServiceImpl 位于。但这感觉像是一个丑陋的解决方法,这就是为什么我想了解那里发生了什么。

    顺致敬意,

    Service Manager Diagram

    1 回复  |  直到 7 年前
        1
  •  1
  •   Peter Kriens    7 年前

    根据理论,这里有一个循环应该是可以的。然而,在实践中也存在一些问题。

    首先,您的实现应该是 immediate=true OSGi enRoute Cycles

    然而,还有一个问题:-(Apache Felix DS有一个bug,正如您所描述的那样会产生影响。这个bug与包排序有关。这在中有报告 Apache Felix JIRA 5618 .

    如果这个DS错误是问题所在,那么不幸的是只有一个固溶体。不幸的是,因为这需要你进入OSGi的内部。解决方案是手动注册manager服务,并确保它不是由DS注册的:

    @Component(service={}, immediate=true )
    public class FooManagerImpl implements FooManager {
    
       private ServiceRegistration<FooManager> registration;
    
       @Reference
       volatile List<FooService> foos;
    
       @Activate
       void activate( BundleContext context, Map<String,Object> properties ) {
         registration = context.registerService(FooManager.class, this, new Hashtable<String,Object>(properties));
       }
    
       @Deactivate
       void deactivate() {
          registration.unregister();
       }
    
       ...
    }
    

    这里的诀窍是,FooManager在正常情况下注册服务时,只有在其被激活后才注册其服务 之前 它被激活。

    我知道阿帕奇·菲利克斯正在努力,但不知道他们还有多远。

    无论如何,周期 总是

    注意:手动注册服务不会创建功能。如果使用需求/功能,则应在清单中添加服务功能,以使解析器工作。如果这句话对你来说是胡言乱语,忽略它。