2012-05-29 11 views
8

, ben isteğe bağlı bir bağımlılık bu şekilde beyan:Blueprint: İsteğe bağlı bağımlılığın sağlanıp sağlanmadığını nasıl kontrol edebilirim? <code>blueprint.xml</code> yılında

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

ve RepositoryImpl göre ben RepositoryListener hizmet mevcut olduğunda bile beklendiği gibi bu yöntem, Blueprint tarafından çağrılan

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

var . Sorun şu ki, 'un hizmetin olup olmadığını nasıl kontrol edebilirim? repositoryListenernull değil, ama bir Blueprint vekil beri

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

, çalışmıyor.

+1

Sınırlı bilgi, ancak 'Repository' fasulye bağlanabilir muhtemelen için belirtilen edilebilir denilen bir şey vardır. –

cevap

14

Üç seçenek vardır. Deneyin ve (eksik) İsteğe bağlı hizmet kullanıyorsanız planı bir ServiceUnavailableException ardından görünmesi için bir destek hizmeti beklerken

  • Normalde, bir beş dakikalık gecikme elde edersiniz. Dolayısıyla, bir seçenek çok kısa bir mavi zaman aşımı ayarlamak ve ServiceUnavailableException'ı yakalamaktır.
  • Muhtemelen daha temiz bir seçenek, hizmetin yaşam döngüsünü izlemek için bir referans dinleyiciyi kullanmaktır. Bunun ekstra kod gerektirme dezavantajı vardır.
  • En basit ve en önemlisi - seçeneğinin tümü, isteğe bağlı bir başvuru kaynağı yerine isteğe bağlı bir başvuru listesi kullanmaktır. Eğer tatmin edici hizmetler yoksa, liste boş olacaktır. Elbette, çoklu tatmin edici hizmetler varsa ne olmasını istediğiniz hakkında düşünmek zorunda kalacaksınız.

sadece opsiyonel servis referansına bir öznitelik eklemek daha kısa zaman aşımını ayarlamak için:

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

, kendi planı xml aşağıdaki gibi bir şey eklemek istediğiniz bir referans dinleyicisi kullanmak için (orada bir daha detaylı bir örnek ve Enterprise OSGi in Action 6. bölümünde tartışma):

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

bind ve unbind yöntemleri servis görünür ve kaybolur olarak adlandırılan (veya edilir Hizmet listesi eklendiğinde ve referans listenizde yer alıyorsa, bir referans listesi kullanıyorsanız).

Bir başvuru listesi kullanmak gerçekten bir kod örneğine ihtiyaç duymaz - sadece bir <reference-list öğeyi kullanın ve ayarlayıcı yönteminizin bir Liste aldığından emin olun.

Benim açımdan
+0

Evet, üçüncü versiyonu da düşündüm. Muhtemelen benim için en iyi seçenek. –