Service Locator
por Giovani Salvador
São inúmeros os design patterns existentes e especificamente para a arquitetura J2EE temos alguns bons patterns que ajudam a simplificar a codificação.
Neste artigo estarei abordando um dos catalogados para a arquitetura J2EE, o Service Locator. O nome deste catálogo chama-se Core J2EE Patterns (Core J2EE Patterns)
O problema:
Clientes de serviço EJB precisam localizar o serviço (através de chamadas lookup) utilizando algumas formas padrão da arquitetura de EJB. Estas formas envolvem a localização do objeto que implementa a interface Home do EJB, a solicitação de uma nova instância de um EJB e a chamada aos métodos de negócio. Além destes passos, se vários clientes tem este mesmos trechos de código, existe a duplicidade desta codificação, dificultando a manutenção.
Um outro problema é que se múltiplos clientes solicitam o mesmo objeto Home a performance da aplicação pode degradar uma vez que muitos recursos são consumidos na localização de um EJB.
Exemplo de uma chamada de um cliente de um EJB sem utilizar o ServiceLocator:
/* A linha abaixo inicializa um contexto para começar a fazer operações de naming. |
Os passos acima geralmente estão distribuídos em vários clientes de EJB resultando nos problemas especificados anteriormente. A Solução:
Use um ServiceLocator para abstrair todos estes passos de chamadas a serviço de EJB.
Os passos para localização dos serviços EJB ficam dentro da classe ServiceLocator e os clientes apenas interagem com esta classe.
O cliente passaria a ter esta chamada:
package br.com.portaljava.tutoriais.ejb; |
Código da classe ServiceLocator (Observe que esta classe também implementa o pattern Singleton):
package br.com.portaljava.tutoriais.ejb; |
Preste atenção a dois métodos na classe ServiceLocator: O getHome e getLocalHome.
O getHome retorna uma referência a uma home de um ejb remoto ao passo que o getLocalHome retorna uma referência a uma home local. Além disso, o método getLocalHome está usando outro pattern para manter o cache de referências a home´s locais, o design pattern EJBHomeFactory, do livro EJB Design Patterns de Floyd Marinescu.
Porque não mantemos cache de referências a home´s remotas também? Bem, em um ambiente distribuído isto pode não ser uma boa prática pois um componente pode estar atendendo em uma máquina e de repente pode atender de outra máquina caso a primeira tenha caído. Daí a referência remota não existe mais. Entraremos em detalhes deste pattern em outro artigo.
É importante observar novamente que o design pattern Service Locator, além de diminiuir a complexidade do código cliente, poupa recursos do lado servidor, aumentando a performance da aplicação.