DS Components的生命周期如何运作?

时间:2014-09-22 08:36:59

标签: java osgi bnd

在bundle start和stop上调用带注释的方法的顺序是什么?

我使用了aQute.bnd.annotation的注释。

有没有关于此的文件?

我的猜测是: 在捆绑开始:

  1. 组A
  2. onStartUp(@Activate)
  3. 关于捆绑停止:

    1. unsetA
    2. onShutdown(@Deactivate)
    3. 我需要一个方法,在未设置对组件的所有服务引用之后调用该方法。我可以使用@Deactivate方法吗?

      @Component(immediate=true)
      public class AImpl implements A {
      
          @Activate
          public void onStartUp() {
      
          }
      
          @Deactivate
          public void onShutDown() {
      
          }
      
      }
      
      
      public class B {
      
      
      private A a;
      
      @Reference(name = "a", 
          service = A.class,  
          optional = false,
          multiple = false,
          dynamic = true,
          unbind = "unsetA")
          public void setA(A a) {
              this.a = a;
          }
      
          public void unsetA(A a) {
              this.a = null;
          }
      
      }
      

1 个答案:

答案 0 :(得分:1)

生命周期在"声明服务" OSGi纲要规范的一章。虽然您使用注释,但会生成XML并且DS基于XML工作。

如果组件停止,则在取消设置引用之前调用@Deactivate方法。您使用动态引用,因此可能会在停止组件之前取消设置引用。

根据您的示例,您可以通过以下方式实现目标:

public class B {

    private boolean started;

    private AtomicReference<A> a = new AtomicReference<A>();

    @Reference(name = "a", 
        service = A.class,  
        optional = false,
        multiple = false,
        dynamic = true,
        unbind = "unsetA")
    public void setA(A a) {
        this.a.set(a) = a;
    }

    public void unsetA(A a) {
        this.a.set(null);
        if (!started) {
            componentIsStoppedAndReferencesAreUnset();
        }
    }

    @Activate
    public void activate() {
        started = true;
    }

    @Deactivate
    public void deactivate() {
        started = false;
        if (this.a.get() == null) {
            componentIsStoppedAndReferencesAreUnset();
        }
    }

    public void componentIsStoppedAndReferencesAreUnset() {
        // Implement your logic here
    }
}

如果您有更多引用,则应在所有未设置方法和停用方法中检查所有引用是否为null。如果您也有静态引用,则可以跳过deactivate方法中的检查,因为它可以确保在deactivate方法之后将取消设置静态引用。

请注意,如果您使用动态参考,则应使用AtomicReference作为线程安全的成员变量。