# Introdução

Enterprise JavaBeans (EJB) é uma API ou componente da linguagem Java (Enterprise Edition – Java EE), ambos desenvolvidos pela Sun Microsystems, que permite a criação modular, utilizando o conceito de componentes, de aplicações servidoras. O componente utiliza o conceito de JavaBeans, componentes da linguagem Java que permitem agrupar diversos objetos em um simples objeto, chamado bean.
O EJB tem como principal objetivo prover uma implementação padrão de funções normalmente repetitivas na construção de aplicações servidoras, permitindo que o foco da programação seja dado à funcionalidade específica que aplicação deve conter e eliminando a preocupação do programador com conceitos mais básicos e de baixo nível. O componente encapsula a lógica de negócio da aplicação e possibilita a construção de aplicações distribuídas, transacionais, seguras e portáveis, tratando conceitos como: persistência, processamento de transações, eventos, segurança, controle de concorrência e chamada a métodos remotos.

# História

A primeira versão do EJB, a versão EJB 1.0, foi lançada em março de 1998 na conferência de desenvolvedores Java chamada JavaOne 1998. Ao longo das versões sucessoras, EJB 1.1, 2.0 e 2.1, diversas alterações foram feitas e funcionalidades foram incluídas, onde podemos citar como mais interessantes, em nosso contexto de sistemas distribuídos, a compatibilidade com protocolos CORBA (RMI-IIOP) e o suporte aos Web services (beans podem acessar Web services e podem ser invocados por SOAP/HTTP, o padrão utilizado pelos Web services). A versão 3.0, última até o momento, foi lançada em maio de 2005.

## Problemas

Um dos problemas comentados em relação ao EJB é a complexidade. Mesmo tratando de diversos problemas comuns a aplicações servidoras com o objetivo de facilitar a programação, a criação de uma aplicação parecia ser ainda mais difícil com o uso de EJB devido à complexidade que a API apresentava a iniciantes.
EJB também apresentava um problema de performance por somente possibilitar a invocação de métodos remotos utilizando CORBA (e posteriormente outros protocolos semelhantes), sendo que muitas aplicações não necessitavam de toda a funcionalidade distribuída oferecida. Entretanto este problema foi resolvido na versão 2.0 com a inclusão de interfaces locais que podem ser utilizadas quando as aplicações não são distribuídas.
Com o passar dos anos foi tornando-se claro para os usuários de EJB que a sua principal funcionalidade, que é possibilitar a integridade de transações entre aplicações distribuídas, não era inteiramente utilizada pela maioria das aplicações desenvolvidas. A versão 3.0, além de incluir outras funcionalidades, buscou solucionar este problema introduzindo formas de lidar com conceitos como persistência e transações de formas utilizadas por frameworks mais compactos que vinham surgindo na época, como Hibernate e Spring. A versão 3.0 é vista como uma API praticamente nova, com apenas algumas referências às versões anteriores.

# Funcionamento

Como EJB utiliza como base o conceito de beans, é necessária uma breve explicação sobre o assunto. Um bean é uma classe Java tradicional que apresenta algumas restrições que fazem dela um bean:
* Não deve ter um método construtor;
* Não deve conter nenhum método de tratamento de eventos;
* Todas suas propriedades devem ser acessíveis através de métodos de acesso (métodos get e set);
* Deve ser serializavel (permitir que seu estado seja salvo e carregado posteriormente).
Estas restrições permitem o tratamento dos beans de uma forma universal, permitindo, por exemplo, a construção de aplicações que manipulem visualmente estes componentes (como acontece em algumas IDEs).
Os beans localizam-se dentro de um container de beans, componente que se situa no servidor de aplicação. Um container pode ter diversos tipos de beans, incluindo beans de sessão (session beans), de entidade (entity beans), direcionados a mensagens (message driven beans), entre outros propostos. A especificação descreve como os beans interagem com o container no qual estão contidos e como o cliente interage com o container e com os beans contidos neste.
Algumas características técnicas do EJB são citadas a seguir:
* Para comunicação remota é utilizado o protocolo RMI-IIOP, um padrão que utiliza o modelo de invocação de métodos remotos do Java sobre o protocolo IIOP, um protocolo utilizado para comunicação no CORBA. Isso possibilita a comunicação entre EJB e aplicações CORBA.
* Utiliza JMS (Java Message Service) (API da linguagem Java para envio de mensagens entre clientes) para envio de eventos entre beans e clientes.
* Para publicação, utiliza um descritor em XML, possibilitando que todos EJB sejam publicados da mesma forma, independente da plataforma EJB específica que foi escolhida. A partir da versão 3.0, os descritores XML foram substituídos por Java annotations, que permitem a adição de metadados ao código implementado.

# Contextualização

A importância do EJB no contexto dos sistemas distribuídos está na possibilidade de construção de aplicações servidoras tratando de diversos conceitos que são extremamente importantes em sistemas distribuídos, como os já citados segurança, eventos, transações, chamadas remotas, entre outros. A possibilidade de interação entre EJBs e aplicações CORBA e também Web services, agrega um valor ainda maior ao EJB em nosso contexto, visto que CORBA foi uma arquitetura muito importante para sistemas distribuídos e Web services é, atualmente, o modelo mais utilizado.

# Links Externos

* Página principal do EJB na Sun Microsystems: http://java.sun.com/products/ejb/ (em inglês)
* EJB na Wikipedia: http://pt.wikipedia.org/wiki/EJB