2014-09-22 71 views
0

以何種順序在bundle開始和結束時調用帶註釋的方法?DS組件的生命週期如何工作?

我使用aQute.bnd.annotation的註釋。

有沒有關於此的任何文檔?

我的猜測是,它是: 上捆綁的開始:

  1. 組A
  2. onStartUp(@Activate)

上束停止:

  1. unsetA
  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; 
    } 

} 

回答

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 
    } 
} 

如果你有更多的參考,你應該檢查所有的人都爲空所有的未固化的方法,並在停用一。如果您也有靜態引用,則可以跳過deactivate方法中的檢查,因爲它可以確保靜態引用在取消激活方法後將被取消設置。

請注意,如果你使用動態引用,你應該使用AtomicReference作爲你的成員變量來保證線程安全。