2012-05-29 14 views
8

In blueprint.xml, dichiaro una dipendenza opzionale in questo modo:Progetto: come posso verificare se una dipendenza opzionale è soddisfatta?

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

e in RepositoryImpl, ho

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

Questo metodo viene chiamato da Blueprint, anche quando non v'è alcuna RepositoryListener servizio, come previsto . Il problema è, come posso verificare in seguito se lo è un servizio?

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

non funziona, dal momento che non è repositoryListenernull, ma un proxy Blueprint.

+1

Conoscenza limitata da parte mia, ma esiste qualcosa chiamato che può essere specificato per e probabilmente collegato al proprio bean 'Repository'. –

risposta

14

Ci sono tre opzioni.

  • Normalmente, se cercare di utilizzare il servizio opzionale (mancante), si otterrà un ritardo di cinque minuti, mentre progetto attende un servizio di supporto a comparire, seguito da un ServiceUnavailableException. Quindi, un'opzione è quella di impostare un timeout di modello molto breve e prendere il ServiceUnavailableException.
  • Un'opzione probabilmente più pulita è quella di utilizzare un listener di riferimento per monitorare il ciclo di vita del servizio. Questo ha lo svantaggio di aver bisogno di codice extra.
  • L'opzione più semplice, e quindi la più pigra, è utilizzare un elenco di riferimenti facoltativo anziché un riferimento facoltativo. Se non sono presenti servizi soddisfacenti, l'elenco sarà vuoto. Certo, dovrai pensare a cosa vuoi che accada se sono presenti più servizi soddisfacenti.

Per impostare un timeout più breve, basta aggiungere un attributo per il vostro riferimento servizio opzionale:

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

Per utilizzare un ascoltatore di riferimento, che ci si aggiunge qualcosa di simile a quanto segue al xml progetto (c'è un esempio più dettagliato e la discussione nel capitolo 6 del Enterprise OSGi in Action):

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

Il bind e unbind metodi sono chiamati come appare e scompare il servizio (o man mano che i servizi vengono aggiunti e rimossi al tuo elenco di riferimento, se stai utilizzando un elenco di riferimento).

L'utilizzo di un elenco di riferimento non ha realmente bisogno di un esempio di codice: è sufficiente utilizzare un elemento <reference-list e assicurarsi che il metodo setter utilizzi un elenco.

+0

Sì, ho pensato anche alla terza versione. Probabilmente l'opzione migliore per me. –