Os Enterprise JavaBeans (EJBs) são componentes server-side no ecossistema Jakarta EE (anteriormente Java EE), usados para implementar lógica de negócios em aplicações empresariais distribuídas. Eles facilitam o desenvolvimento de aplicações escaláveis, transacionais e seguras. As interfaces @Local
e @Remote
definem como os clientes acessam esses beans, determinando se o acesso é local (dentro da mesma máquina virtual Java, ou JVM) ou remoto (entre diferentes JVMs ou máquinas). Vamos explicar passo a passo como elas funcionam, com foco na diferença entre elas e no conceito de compartilhamento entre repositórios (que interpreto como compartilhamento de EJBs entre diferentes módulos, aplicações ou repositórios de código/projetos).
Como Funciona a Interface @Local
Definição e Uso: A anotação
@Local
é aplicada a uma interface de negócios de um EJB (como um Session Bean). Ela indica que o bean deve ser acessado apenas localmente, ou seja, por clientes que estão no mesmo contexto de aplicação ou na mesma JVM. Isso evita o overhead de chamadas de rede, tornando o acesso mais rápido e eficiente.-
Características Principais:
- Eficiência: Não requer serialização de objetos (conversão para bytes para transmissão), pois não há comunicação remota. Os parâmetros e retornos podem ser passados por referência.
- Métodos: A interface define os métodos de negócios do bean, mas sem os métodos extras necessários para chamadas remotas (como aqueles relacionados a exceções de rede).
- Exemplo de Código:
import javax.ejb.Local; @Local public interface MeuBeanLocal { String saudacao(String nome); }
Em seguida, o bean implementa essa interface:
import javax.ejb.Stateless; @Stateless public class MeuBean implements MeuBeanLocal { public String saudacao(String nome) { return "Olá, " + nome + "!"; } }
Um cliente local (ex.: outro componente na mesma aplicação) injeta o bean via
@EJB
e o usa diretamente. Quando Usar: Ideal para aplicações monolíticas ou módulos dentro do mesmo servidor de aplicação (como WildFly, GlassFish ou TomEE), onde não há necessidade de distribuição remota. É uma escolha de design para otimizar performance.
Como Funciona a Interface @Remote
Definição e Uso: A anotação
@Remote
marca uma interface para acesso remoto, permitindo que clientes em diferentes JVMs ou máquinas acessem o bean via protocolos como RMI (Remote Method Invocation) ou IIOP. Isso envolve chamadas de rede, o que adiciona latência, mas permite distribuição.-
Características Principais:
-
Distribuição: Requer que parâmetros e retornos sejam serializáveis (implementem
Serializable
), pois são transmitidos pela rede. Pode lançar exceções remotas comoRemoteException
. -
Métodos: Inclui mais métodos implícitos (via
EJBObject
) para gerenciamento remoto, como verificações de igualdade ou remoção. - Exemplo de Código:
import javax.ejb.Remote; @Remote public interface MeuBeanRemote { String saudacao(String nome); }
O bean implementa:
import javax.ejb.Stateless; @Stateless public class MeuBean implements MeuBeanRemote { public String saudacao(String nome) { return "Olá remoto, " + nome + "!"; } }
Um cliente remoto usa JNDI (Java Naming and Directory Interface) para lookup e invoca os métodos.
-
Distribuição: Requer que parâmetros e retornos sejam serializáveis (implementem
Quando Usar: Para cenários distribuídos, como microservices ou aplicações cliente-servidor onde o cliente está em uma máquina diferente. É útil em clusters ou ambientes de nuvem.
Diferenças Principais entre @Local
e @Remote
Aspecto | @Local |
@Remote |
---|---|---|
Acesso | Local (mesma JVM) | Remoto (diferentes JVMs/máquinas) |
Eficiência | Alta (sem rede/serialização) | Baixa (overhead de rede) |
Serialização | Não necessária | Obrigatória para params/retornos |
Exceções | Exceções locais normais | Pode lançar RemoteException |
Uso Típico | Dentro da mesma aplicação | Entre aplicações distribuídas |
Bindings | Bindings locais no container EJB | Bindings remotos via JNDI |
Essas diferenças são definidas no container EJB, que gerencia o ciclo de vida e as invocações.
Compartilhamento entre Repositórios: Como Funciona?
O termo "compartilhamento entre repositórios" pode se referir a como EJBs são compartilhados entre diferentes módulos de código, projetos ou repositórios (ex.: em Git ou Maven), especialmente em ambientes modulares ou distribuídos. Nos EJBs:
Via Interfaces Remotas (@Remote): Permite compartilhamento real entre repositórios ou aplicações separadas. Por exemplo, um EJB deployado em um servidor pode ser acessado por múltiplos clientes de diferentes repositórios de código via lookup JNDI. Isso facilita a reutilização de lógica de negócios em projetos distribuídos, como em um ecossistema de microservices onde um repositório contém o EJB e outro o cliente remoto.
Via Interfaces Locais (@local): O compartilhamento é limitado ao mesmo EAR (Enterprise Archive) ou módulo. Se você tiver múltiplos repositórios, eles precisam ser empacotados juntos no mesmo deploy para acessar o EJB localmente. Não é ideal para compartilhamento externo.
-
Mecânica de Compartilhamento:
- Em Repositórios de Código: Use Maven ou Gradle para depender de um artefato comum contendo as interfaces. O repositório do EJB publica o JAR com as interfaces, e outros repositórios o importam como dependência. Para remotos, o cliente usa as interfaces para invocar via rede.
- Em Ambientes de Cluster: EJBs remotos suportam load balancing e failover, permitindo compartilhamento de instâncias entre nós de cluster (diferentes "repositórios" de deploy).
- Bindings e No-Interface View: Em EJB 3.1+, há bindings automáticos para interfaces, facilitando o compartilhamento sem configuração manual. Para "no-interface" (sem anotação explícita), é tratado como local por padrão.
Em resumo, @Remote
é chave para compartilhamento amplo entre repositórios independentes, enquanto @Local
otimiza para integração interna.