仅在满足特定条件时如何激活OSGI捆绑包?

时间:2020-05-07 08:36:55

标签: java reference osgi osgi-bundle

我对OSGI有点陌生,我想要执行以下操作:仅在满足某些先决条件时激活我的捆绑软件(顺便说一句,我们是从一个本机库中获得的,但这是另一回事了)。 AFAIK可以通过@Reference DS来实现,但是我没有完全理解。我的意思是,如果我在@Act​​ivate DS之前写这样的内容:

@Reference
public AnotherService as

@Activate
public void activate() {
   //some code 
}

这实际上意味着,在激活AnotherService之前,我的捆绑包不会被激活。但是我可以在AnotherService或捆绑包中写这样的东西吗?:

@Activate
public void activate() {
   if (condition){
       deactivate()
   }
   //some code 
}

@Deactivate
public void deactivate() {
//some code
}

据我了解,这是不可能的。然后出现了问题:如何根据某些条件控制捆绑软件或其引用的激活?即我希望我的捆绑包在满足条件时被激活(在激活之前),或者在不满足条件时被停用。它不适合我:“仅执行if语句,如果不满意,什么也不做,但仍然被激活”,因为此捆绑包的“激活”资源非常繁重。也许我对OSGI的想法完全错误。

1 个答案:

答案 0 :(得分:2)

这不是您应该做的事情。只要您的捆绑包可以解析(即满足其所有导入和其他静态依赖关系),就应始终将其激活。

实际上,除非您要对OSGi进行高级编码,否则根本不应该编写BundleActivators。如果您正在阅读2020年的OSGi教程,告诉您编写BundleActivator,请停止阅读...该教程是垃圾邮件。

您应该使用声明式服务组件。组件是由OSGi管理的对象,其生命周期可以绑定到服务的可用性。例如:

@Component
public class MyComponent implements MyService {

  private final AnotherService service;

  @Activate
  public MyComponent(@Reference AnotherService service) {
    this.service = service;
  }

  @Override
  public void doSomething() {
    // ...
  }
}

在此示例中,将创建MyComponent的实例并将其发布为MyService类型的服务,仅 ,当类型为AnotherService的服务可用时。您将可以通过最后的AnotherService字段调用service。这是强制性的服务引用,这是DS中的默认设置,但也可以创建可选的动态引用(即可以在组件生命周期内重新绑定到其他服务实例的引用),但是不必担心这些用例,直到以后在OSGi学习中。