Transformando serviços em componentes EJB

Cada serviço desenvolvido nas aplicações pode ser um componente "distribuído" em potencial. A estratégia atual de implementação dos serviços

na forma de componentes (interface+implementação) facilita bastante este trabalho, pois na realidade serão necessários apenas adicionar

algumas anotações e alguns descritores XML dos serviços que serão distribuídos.
Serviços EJB3 distribuídos na plataforma JEE5 requerem um servidor com um contêiner EJB que esteja preparado para essa especificação, no

caso utilizaremos o servidor Glassfish na versão 2 ou maior para distribuir os serviços. Ele pode ser encontrado no próprio site do projeto em

http://glassfish.java.net/.

Para utilizar a especificação citada acima no Glassfish V2 é necessário adicionar a seguinte API como dependência no gerenciador de

dependências Maven no pom.xml do projeto:
<dependency> <groupId>javax.ejb</groupId> <artifactId>ejb-api</artifactId> <version>3.0</version>

</dependency> <dependency> <groupId>glassfish</groupId> <artifactId>glassfish-ejb-all</artifactId>

<version>2.1</version> <type>pom</type> <scope>test</scope> </dependency>
Partindo de um serviço existente em um projeto vamos adicionar as anotações necessárias para que a interface e a implementação do serviço

possa ser distribuído. Inicialmente, a classe de implementação (project.service.impl.ServicoXxxImpl) precisa ser anotada como um

serviço que terá ou não seu estado mantido, conforme descrito abaixo:

  • @javax.ejb.Stateless: a primeira maneira serve para distribuir um serviço que não terá estado, ou seja, um serviço responsável somente por

     resolver alguma coisa em uma única chamada e que poderá ser reutilizado por outra aplicação em seguida sem problemas, seguindo a idéia do

     patten façade. Este tipo de serviço é mais performático e o servidor cria um pool deste tipo de componente para facilitar o seu reuso. Este tipo

       de serviço tem um ciclo de vida mais simples.

  • @javax.ejb.Stateful: a segunda maneira serve para distribuir um serviço que manterá o seu estado, o contêiner garantirá que o mesmo

      cliente está utilizando a mesma instância do serviço. Este tipo de serviço não são colocados/recuperados de um pool, ao invés disso são

 criados e vivem até que sejam removidos ou seja atingido o tempo máximo da requisição. Este tipo de serviço tem um ciclo de vida mais complexo.

   Posteriormente, existem duas formas de um componente EJB ser distribuído através da interface do serviço (project.service.ServicoXxx),

     local e remoto, conforme descrito abaixo:

  • @javax.ejb.Local: a primeira maneira serve para distribuir o serviço para acesso somente dentro do contexto da VM na qual estão rodando

                as aplicações ou seja dentro da VM das aplicações dentro do servidor Glassfish.

  • @javax.ejb.Remote: a segunda maneira serve para distribuir o serviço para acesso remoto, de fora do servidor de aplicações onde

          está rodando o serviço, pode ser acessado em outro servidor web, de aplicações ou até por aplicações cliente.