0

捆绑启动和停止时调用的注释方法的顺序是什么?

我使用 aQute.bnd.annotation 的注解。

有这方面的任何文件吗?

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

  1. 组A
  2. onStartUp (@Activate)

在捆绑停止:

  1. 未设置A
  2. onShutdown (@Deactivate)

我需要一个在所有对组件的服务引用都未设置后调用的方法。我可以为此使用@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;
    }

}
4

1 回答 1

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 作为线程安全的成员变量。

于 2014-09-22T09:33:41.130 回答