2012-05-29 29 views
8

blueprint.xml,我宣佈一個可選的依賴是這樣的:藍圖:如何檢查是否滿足可選依賴項?

<reference id="RepositoryListener" 
    interface="ru.focusmedia.odp.server.datastore.api.RepositoryListener" 
    availability="optional" /> 

<bean id="Repository" 
    class="ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl"> 
    <jpa:context property="entityManager" unitname="ODP_Server" /> 
    <tx:transaction method="*" value="Required" /> 
    <property name="repositoryListener" ref="RepositoryListener" /> 
</bean> 

RepositoryImpl,我有

public void setRepositoryListener(RepositoryListener repositoryListener) { 
    logger.info("Repository listener set"); 
    this.repositoryListener = repositoryListener; 
} 

此方法由藍圖稱爲即使沒有RepositoryListener服務,如預期。問題是,我以後怎麼檢查是否有一個服務?

if (repositoryListener != null) { 
     repositoryListener.notifyDelete(node); 
    } else { 
     logger.warn("No repository listener set!"); 
    } 

不起作用,因爲repositoryListener不是null,而是一個藍圖代理。

+1

我的部分知識有限,但有一些名爲的東西可以爲指定,並且可能與您的'Repository' bean相關聯。 –

回答

14

有三種選擇。

  • 通常情況下,如果試圖使用(失蹤)可選的服務,你會同時藍圖等待支撐服務出現,隨後ServiceUnavailableException得到一個五分鐘的延遲。所以一個選擇是設置一個非常短的藍圖超時,並捕獲ServiceUnavailableException。
  • 毫無疑問,更乾淨的選擇是使用引用監聽器來監視服務的生命週期。這具有需要額外代碼的缺點。
  • 所有的最簡單 - 因此最懶惰 - 選項是使用可選的參考列表,而不是可選的參考。如果沒有滿意的服務,該列表將爲空。當然,如果存在多個令人滿意的服務,您將不得不考慮想要發生什麼。

要設置較短的超時,只需要加一個屬性,您可選的服務引用:

<reference 
    id="someReference" 
    interface="org.some.service.ServiceInterface" 
    availability="optional" 
    timeout="100" /> 

使用參考監聽器,你會加入類似以下到您的藍圖XML(有一個更詳細的例子,在Enterprise OSGi in Action 6章討論):

<reference 
     id="someReference" 
     interface="org.some.service.ServiceInterface"> 
     <reference-listener 
      ref="someBean" 
      bind-method="bind" 
      unbind-method="unbind" /> 
    </reference> 

bindunbind方法被稱爲服務出現和消失(或因爲服務被添加並刪除到您的參考列表中,如果您使用的是參考列表)。

使用參考列表並不需要代碼示例 - 只需使用<reference-list元素並確保setter方法使用List。

+0

是的,我也想過第三個版本。對我來說可能是最好的選擇。 –