2012-05-29 12 views
8

In blueprint.xml erkläre ich eine optionale Abhängigkeit auf diese Weise:Blueprint: Wie überprüfe ich, ob eine optionale Abhängigkeit erfüllt ist?

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

und in RepositoryImpl, ich habe

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

Diese Methode wird von Blueprint auch genannt wird, wenn es keine RepositoryListener Dienst verfügbar ist, wie erwartet . Das Problem ist, wie kann ich später überprüfen, ob ein Service ist?

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

nicht funktioniert, da repositoryListener nicht null, sondern ein Blueprint-Proxy.

+1

begrenzte Kenntnisse von mir, aber es ist etwas, genannt , die für angegeben werden kann und wahrscheinlich zu 'Repository' Bean verknüpft werden. –

Antwort

14

Es gibt drei Optionen.

  • Normalerweise, wenn versuchen, die (fehlende) optionaler Dienst verwenden, werden Sie eine Verzögerung von fünf Minuten bekommen, während Entwurf für eine Unterstützung Service wartet, von einem ServiceUnavailableException gefolgt erscheinen. Eine Option besteht also darin, ein sehr kurzes Blueprint-Timeout festzulegen und die ServiceUnavailableException abzufangen.
  • Eine wohl saubere Option ist einen Referenz-Listener zu verwenden, um den Lebenszyklus des Dienstes zu überwachen. Dies hat den Nachteil, dass zusätzlicher Code benötigt wird.
  • Die einfachste - und damit faulste - Option von alle ist eine optionale Referenzliste anstelle einer optionalen Referenz zu verwenden. Wenn keine zufriedenstellenden Dienste vorhanden sind, ist die Liste leer. Natürlich müssen Sie darüber nachdenken, was Sie wollen, wenn mehrere befriedigende Dienste vorhanden sind.

eine kürzere Timeout einzustellen, nur ein Attribut optionalen Dienstverweis hinzufügen:

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

einen Verweis Hörer zu verwenden, Sie so etwas wie die folgenden zu Ihren Plan xml hinzufügen würde (es gibt eine detaillierteres Beispiel und Diskussion in Kapitel 6 von Enterprise OSGi in Action):

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

Die bind und unbind Methoden aufgerufen werden als Dienst erscheint und verschwindet (oder wenn Services eine Referenzliste hinzufügen und entfernen, wenn Sie eine Referenzliste verwenden).

Die Verwendung einer Referenzliste erfordert nicht wirklich ein Codebeispiel - verwenden Sie einfach ein <reference-list Element und stellen Sie sicher, dass Ihre Setter-Methode eine Liste annimmt.

+0

Ja, ich habe auch an die dritte Version gedacht. Wahrscheinlich die beste Option für mich. –

Verwandte Themen