2012-05-29 12 views
8

En blueprint.xml, declaro una dependencia opcional de esta manera:Blueprint: ¿cómo puedo verificar si se cumple una dependencia opcional?

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

y en RepositoryImpl, tengo

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

Este método es llamado por Blueprint, incluso cuando no hay RepositoryListener servicios disponibles, como se esperaba . El problema es, ¿cómo puedo verificar más adelante si hay en un servicio?

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

no funciona, ya que no es repositoryListenernull, pero un proxy Blueprint.

+1

Conocimiento limitado de mi parte, pero hay algo llamado que se puede especificar para y probablemente esté vinculado a su 'Repository' bean. –

Respuesta

14

Hay tres opciones.

  • Normalmente, si tratar de usar la (falta) de servicio opcional, que obtendrá un retraso de cinco minuto mientras anteproyecto espera a un servicio de respaldo a aparecer, seguido de un ServiceUnavailableException. Entonces, una opción es establecer un tiempo de espera del modelo muy corto y capturar la excepción ServiceUnavailableException.
  • Una opción posiblemente más limpia es utilizar un oyente de referencia para monitorear el ciclo de vida del servicio. Esto tiene la desventaja de necesitar código adicional.
  • La opción más sencilla (y por lo tanto, la más lenta) de todas es usar una lista de referencia opcional en lugar de una referencia opcional. Si no hay servicios satisfactorios, la lista estará vacía. Por supuesto, tendrá que pensar en lo que quiere que suceda si hay varios servicios satisfactorios.

Para establecer un tiempo de espera más corto, sólo tiene que añadir un atributo a su referencia de servicio opcional:

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

Para utilizar un oyente de referencia, deberá añadir algo como lo siguiente a su xml modelo (hay una ejemplo más detallado y discusión en el capítulo 6 de Enterprise OSGi in Action):

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

El bind y unbind métodos son llamados como aparece y desaparece su servicio (o a medida que los servicios se agregan y eliminan a su lista de referencia, si está utilizando una lista de referencia).

El uso de una lista de referencias realmente no necesita un ejemplo de código: simplemente use un elemento <reference-list y asegúrese de que su método setter tome una lista.

+0

Sí, he pensado en la tercera versión también. Probablemente la mejor opción para mí. –

Cuestiones relacionadas