Catálogo de Patrones de Diseño J2EE. Y II: Capas de Negocio y de Integración

Un sistema multi-capa distribuido requiere invocaci�n remota de m�todos para enviar y recibir datos entre las capas. Los clientes est�n expuestos a la complejidad de tratar con componentes distribuidos.

.�Problema

Los componentes de la capa de presentaci�n interact�an directamente con servicios de negocio. Esta interacci�n directa expone los detalles de la implementaci�n del API del servicio de negocio a la capa de presentaci�n. Como resultado, los componentes de la capa de presentaci�n son vulnerables a los cambios en la implementaci�n de los servicios de negocio: cuando cambia la implementaci�n del servicio de negocio, la implementaci�n del codigo expuesto en la capa de presentaci�n tambi�n debe cambiar.

Adem�s, podr�a haber una reducci�n de rendimiento en la red porque los componentes de la capa de presentaci�n que utilizan el API de servicio de negocio hacen damasiadas invocaciones sobre la red. Esto sucede cuando los componentes de la capa de presentaci�n usan directamente el API subyacente, sin cambiar el mecanismo del lado del cliente o agregar servicios.

Por �ltimo, exponer directamente los APIs de servicios al cliente fuerza a �ste a tratar con los problemas de red asociados con la naturaleza distribuida de la tecnolog�a Enterprise JavaBeans (EJB).

.�Causas

  • Los clientes de la capa de presentaci�n necesitan acceder a servicios de negocio.
  • Diferentes clientes, dispositivos, clientes Web, y programas, necesitan acceder a los servicios de negocio.
  • Los APIs de los servicios de negocio podr�an cambiar seg�n evolucionan los requerimientos del negocio.
  • Es deseable miniminar el acoplamiento entre los clientes de la capa de presentaci�n y los servicios de negocio, y as� ocultar los detalles de la implementaci�n del servicio.
  • Los clientes podr�an necesitar implementar mecanismos de cach� para la informaci�n del servicio de negocio.
  • Es deseable reducir el tr�fico de red entre el cliente y los servicios de negocio.

.�Soluci�n

Utilizamos un Business Delegate para reducir el acoplamiento entre los clientes de la capa de presentaci�n y los servicios de negocio. El Business Delegate oculta los detalles de la implementaci�n del servicio de negocio, como los detalles de b�squeda y acceso de la arquitectura EJB.

El Business Delegate act�a como una abstracci�n de negocio del lado del cliente; proporciona una abstracci�n para, y por lo tanto oculta, la implementaci�n de los servicios del negocio. Utilizando Business Delegate se reduce el acoplamiento entre los clientes de la capa de presentaci�n y los servicios de negocio del sistema. Dependiendo de la estrategia de implementaci�n, Business Delegate podr�a aislar a los clientes de la posible volatilidad en la implementaci�n del API de los servicios de negocio. Potencialmente, esto reduce el n�mero de cambios que se deben hacer en el c�digo de cliente de la capa de presentaci�n cuando cambie el API del servicio de negocio o su implementaci�n subyacente.

Sin embargo, los m�todos de interface en el Business Delegate a�n podr�a requerir modificaciones si cambia el API del servicio de negocio. Si bien es cierto, que los cambios se har�n con m�s probabilidad en el servicio de negocio que en el Business Delegate.

Con frecuencia, los desarrolladores son exc�pticos cuando un objetivo de dise�o como la abstracci�n de la capa de negocio provoca un trabajo adicional como pago por futuras ganancias. Sin embargo, utilizando este patr�n o esta estrategia resulta s�lo en una peque�a cantidad de trabajo extra y proporciona unos beneficios considerables. El principal beneficio es ocultar los detalles del servicio. Por ejemplo, el cliente puede ser transparente para los servicios de b�squeda y nombrado. El Business Delegate tambi�n maneja las excepciones de los servicios de negocio, como excepciones java.rmi.Remote, excepciones Java Messages Service (JMS), etc. El Business Delegate podr�a interceptar dichas excepciones a nivel de servicio y generar en su lugar excepciones a nivel de aplicaci�n. Las excepciones de nivel de aplicacion son f�ciles de manejar por los clientes, y pueden ser amigables para el usuario. El Business Delegate tambi�n podr�a realizar de forma transparene cualquier operaci�n de reintento o de recuperaci�n necesaria en el caso de un fallo en el servicio no exponer el cliente al problema hasta que se haya determinado que el problema no es solucionable. Estas ganancias representan una raz�n competitiva para utilizar el patr�n.

Otro beneficio es que el delegado podr�a almacenar resultados y referencias a servicios de negocio remotos. El Cach� puede mejorar el rendimiento de forma significativa, porque limita los innecesarios y potencialmente costosos viajes por la red.

Un Business Delegate utiliza un componente llamado Lookup Service. Este componente es el responsable de ocultar los detalles de implementaci�n de c�digo de b�squeda del servicio de negocio. El Lookup Service podr�a estar escrito como parte del Delegate, pero recomendamos que se implemente como un componento separado.

Cuando el Business Delegate se utiliza con un Session Facade, normalmente hay una relaci�n uno-a-uno entre los dos. Esta relaci�n existe porque la l�gica que podr�a haber sido encapsulada en un Business Delegate en relaci�n a su interacci�n con varios servicios de negocio (creando una relaci�n uno-a-uno) normalmente se construye de vuelta en un Session Facade.

Finalmente, se deber�a tener en cuenta que este patr�n se podr�a utilizar para reducir el acoplamiento entre otra capas, no simplemente entre las capas de presentaci�n y de negocio.

.�Estructura

La siguiente figura muestra el diagrama de clases que representa al patr�n Business Delegate. El cliente solicita al BusinessDelegate que le proporcione acceso al servicio de negocio subyacente. El BusinessDelegate utiliza un LookupService para localizar el componente BusinessService requerido.

.�Participantes y Responsabilidades

Ls siguiente figura muestra el diagrama de secuencia que ilustra las interacciones t�picas para este patr�n:

El BusinessDelegate utiliza un LookupService para localizar el servicio de negocio. El servicio de negocio se utiliza para invocar a los m�todos de negocio por cuenta del cliente. El m�todo Get_ID muestra que el BusinessDelegate puede obtener una versi�n String del handle (como un objeto EJBHandle) para el servicio de negocio y devolverlo al cliente como un String. El cliente puede utilizar la versi�n String del handle m�s tarde para reconectar con el servicio de negocio que estaba utilizando cuando obtuvo el handle. Esta t�cnica evitar� nuevas b�squedas, ya que el handle es cap�z de reconectar con su ejemplar del servicio de negocio. Se deber�a observar que los objetos handle los implementa el contenedor y podr�an no ser portables entre contenedores de diferentes vendedores.

El diagrama de secuencia de la siguiente figura muestra la obtenci�n de un BusinessService (como un bean de sesi�n o de entidad) utilizando este handle.

.�BusinessDelegate

El rol de BusinessDelegate es proporcionar control y protecci�n para el servicio de negocio. BusinessDelegate puede exponer dos tipos de constructores al cliente. Un tipo de petici�n ejemplariza el BusinessDelegate sin una ID, mientras que el otro lo inicializa con un ID, donde ID es una versi�n String de la referencia al objeto remoto como un EJBHome o un EJBObject.

Cuando se inicializa sin una ID, el BusinessDelegate solicita el servicio al Lookup Service, normalmente implementado como un Service Locator (m�s adelante veremos el patr�n Service Locator), que devuelve el Service Factory, como un EJBHome. El BusinessDelegate pide que el Service Factory localice, cree o elimine un BusinessService, como un bean enterprise.

Cuando se inicializa con un ID, el BusinessDelegate usa el ID para reconectar con el BusinessService. As�, el BusinessDelegate aisla al cliente de los detalles de la implementaci�n del BusinessService de nombrado y b�squeda. Adem�s, el cliente de la capa de presentaci�n nunca hace llamadas remotas directas sobre un BusinessSession; en su lugar, el cliente utiliza el BusinessDelegate.

.�LookupService

BusinessDelegate utiliza el objeto LookupService para localizar a BusinessService. LookupService encapsula los detalles de la implementaci�n de la b�squeda de BusinessService.

.�BusinessService

BusinessService es un componente de la capa de negocio, como un bean enterprise o un componente JMS, que proprociona el servicio requerido por el cliente.

.�Estrategias

.�Delegate Proxy

El Business Delegate expone un interface que proporciona a los clientes acceso a los m�todos subyacentes del API de servicios de negocio. En esta estrategia, un Business Delegate proporciona la funci�n de proxy para pasar los m�todos del cliente al bean de sesi�n que encapsula. Adicionalmente el Business Delegate podr�a hacer un cach� con los datos necesarios, incluyendo las referencias remotas de los objetos home o remote del bean de sesi�n para mejorar el rendimiento reduciendo el n�mero de b�squedas. El Business Delegate tambi�n podr�a convertir dichas referencias en identificadores de versi�n (IDs) y viceversa, utilizando los servicios de un Service Locator.

El ejemplo de implementaci�n de esta estrategia se explica en la secci�n C�digo de Ejemplo de esta p�gina.

.�Delegate Adapter

El Business Delegate parece ser bueno en un entorno B2B cuando se comunica con servicios basados en la plataforma J2EE. Los sistemas dispares podr�an utilizar XML como el lenguaje de integraci�n. Integrar un sistema en otro normalmente requiere un Adapter [GoF] para unir los dos sistemas dispares. La siguiente figura nos muestra un ejemplo:

.�Consecuencias

  • Reduce el Acoplamiento, Mejora la Manejabilidad
    El Business Delegate reduce el acoplamiento entre la capas de presentaci�n y de negocio ocultando todos los detalles de implementaci�n de la capa de negocio. Es f�cil manejar los cambios porque est�n centralizados en un s�lo lugar, el Business Delegate.
  • Traduce las Excepciones del Servicio de Negocio
    El Business Delegate es el responsable de traducir cualquier excepci�n de red o relacionada con la infraestructura en excepciones de negocio, aislando a los clientes del conocimiento de las especifidades de la implementaci�n.
  • Implementa Recuperaci�n de Fallos y Sincronizaci�n de Threads
    Cuando el Business Delegate encuentra un fallo en el servicio de negocio, puede implementar caracter�sticas de recuperaci�n autom�tica sin exponer el problema al cliente. Si la recuperaci�n tiene �xito, el cliente no necesita saber nada sobre el fallo. Si el intento de recuperaci�n no tiene �xito, entonces el Business Delegate necesita informar al cliente del fallo. Adem�s, los m�todos del Business Delegate podr�an estar sincronizados, si fuera necesario.
  • Expone un Interface Simple y Uniforme a la Capa de Negocio
    El Business Delegate, para servir mejor a sus clientes, podr�a proporcionar una variante del interface proporcionado por los beans enterprise subyacentes.
  • Impacto en el Rendimiento
    El Business Delegate podr�a proporcionar servicio de cach� (y un mejor rendimiento) a la capa de presentaci�n para las peticiones de servicios comunes.
  • Presenta una Capa Adicional
    El Business Delegate podr�a verse como la adicci�n de una capa innecesaria entre el cliente y el servicio, y con eso incrementar la complejidad y disminuir la flexibilidad. Algunos desarrolladores podr�an sentir esto coomo un esfuerzo extra para desarrollar Business Delegates con implementaciones que utilizan la estrategia Delegate Proxy.
  • Oculta los elementos Remotos
    Aunque la localizaci�n transparente es uno de los beneficios de este patr�n, podr�a surgir un problema diferente debido a que el desarrolador est� tratanto con un servicio remoto como si fuera un servicio local. Esto podr�a suceder si el desarrollador del cliente no entiende que el Business Delegate es cliente-proxy a un servicio remoto. Normalmente, unas llamadas a m�todos en el Business Delegate resultan en unas llamadas a m�todos remotos bajo la envoltura. Ignorando esto, el desarrollador podr�a tender a realiaar varias llamadas a m�todos para realizar una sola tarea, lo que incrementar� el tr�fico en la red.

.�C�digo de Ejemplo: Implementar el Patr�n Business Delegate

Consideremos una Aplicaci�n de Servicios Profesional (PSA), donde un cliente de la capa Web necesita acceder a un bean de sesi�n que implementa el patr�n Session Facade. Se puede aplicar el patr�n Business Delegate para dise�ar un clase Delegate como ResourceDelegate, que ecapsula la complejidad de tratar con el bean de sesi�n ResourceSession. En el siguientre fragmento de c�digo podemos ver la implementaci�n de la clase ResourceDelegate:


// imports
...

public class ResourceDelegate {

  // Remote reference for Session Facade
  private ResourceSession session;

  // Class for Session Facade's Home object
  private static final Class homeClazz =
  corepatterns.apps.psa.ejb.ResourceSessionHome.class;

  // Default Constructor. Looks up home and connects
  // to session by creating a new one
  public ResourceDelegate() throws ResourceException {
    try {
      ResourceSessionHome home = (ResourceSessionHome)
        ServiceLocator.getInstance().getHome(
          "Resource", homeClazz);
      session = home.create();
    } catch(ServiceLocatorException ex) {
      // Translate Service Locator exception into
      // application exception
      throw new ResourceException(...);
    } catch(CreateException ex) {
      // Translate the Session create exception into
      // application exception
      throw new ResourceException(...);
    } catch(RemoteException ex) {
      // Translate the Remote exception into
      // application exception
      throw new ResourceException(...);
    }
  }

  // Constructor that accepts an ID (Handle id) and 
  // reconnects to the prior session bean instead
  // of creating a new one
  public BusinessDelegate(String id) 
    throws ResourceException {
    super();
    reconnect(id);
  }

  // Returns a String ID the client can use at a
  // later time to reconnect to the session bean
  public String getID() {
    try {
      return ServiceLocator.getId(session);
    } catch (Exception e) {
      // Throw an application exception
    }
 }

  // method to reconnect using String ID
  public void reconnect(String id) 
    throws ResourceException {
    try {
      session = (ResourceSession) 
                ServiceLocator.getService(id);
    } catch (RemoteException ex) {
      // Translate the Remote exception into
      // application exception
      throw new ResourceException(...);
    }
  }

  // The following are the business methods
  // proxied to the Session Facade. If any service 
  // exception is encountered, these methods convert
  // them into application exceptions such as
  // ResourceException, SkillSetException, and so 
  // forth.

  public ResourceTO setCurrentResource(
    String resourceId)                  
    throws ResourceException {
    try {
      return session.setCurrentResource(resourceId);
    } catch (RemoteException ex) {
      // Translate the service exception into
      // application exception
      throw new ResourceException(...);
    }
  }

  public ResourceTO getResourceDetails()
    throws ResourceException {

    try {
      return session.getResourceDetails();
    } catch(RemoteException ex) {
      // Translate the service exception into
      // application exception
      throw new ResourceException(...);
    }
  }

  public void setResourceDetails(ResourceTO vo)
    throws ResourceException {
    try {
      session.setResourceDetails(vo);
    } catch(RemoteException ex) {
      throw new ResourceException(...);
    }
  }

  public void addNewResource(ResourceTO vo)
    throws ResourceException {
    try {
      session.addResource(vo);
    } catch(RemoteException ex) {
      throw new ResourceException(...);
    }
  }

  // all other proxy method to session bean
  ...
}

El siguiente fragmento de c�digo representa el interface remoto correspondiente al bean Session Facade ResourceSession:


// imports
...
public interface ResourceSession extends EJBObject {
  
  public ResourceTO setCurrentResource(
    String resourceId) throws 
    RemoteException, ResourceException;
        
  public ResourceTO getResourceDetails() 
     throws RemoteException, ResourceException;
  public void setResourceDetails(ResourceTO resource) 
     throws RemoteException, ResourceException;
        
  public void addResource(ResourceTO resource) 
      throws RemoteException, ResourceException;
        
  public void removeResource() 
      throws RemoteException, ResourceException;
        
  // methods for managing blockout time by the 
  // resource
  public void addBlockoutTime(Collection blockoutTime)
      throws RemoteException, BlockoutTimeException;
        
  public void updateBlockoutTime(
    Collection blockoutTime) 
      throws RemoteException, BlockoutTimeException;
        
  public void removeBlockoutTime(
    Collection blockoutTime) 
      throws RemoteException, BlockoutTimeException;
        
  public void removeAllBlockoutTime() 
      throws RemoteException, BlockoutTimeException;
        
  // methods for resource skillsets time by the 
  //resource
  public void addSkillSets(Collection skillSet) 
      throws RemoteException, SkillSetException;
        
  public void updateSkillSets(Collection skillSet) 
      throws RemoteException, SkillSetException;
        
  public void removeSkillSet(Collection skillSet) 
      throws RemoteException, SkillSetException;

  ...
}

.�Patrones Relacionados

  • Service Locator
    El patr�n Service Locator se podr�a utilizar para crear el servicio de b�squeda del Business Delegate, ocultando los detalles de implementaci�n de cualquier servicio de b�squeda y c�digo de acceso.
  • Proxy [GoF]
    Un Business Delegate podr�a actuar como un proxy, proporcionando suplentes para los objetos en la capa de negocio.
  • Adapter [GoF]
    Un Business Delegate podr�a utilizar el patr�n Adapter para proporcionar acoplamiento para sistemas dispares.
  • Broker [POSA1]
    Un Business Delegate realiza el rol de un broker para desacoplar los objetos de la capa de negocio de los clientes de otras capas.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR