Introdução aos EJBs e Suas Interfaces @Local e @Remote
Kauê Matos

Kauê Matos @ikauedev

About: Desenvolvedor de Software desde 2019, com experiência em projetos web de grande escala que impactam milhões de usuários. Trabalho com tecnologias como Java, Spring boot Framework, TypeScript, Angular

Location:
Brazil
Joined:
Apr 10, 2023

Introdução aos EJBs e Suas Interfaces @Local e @Remote

Publish Date: Aug 23
1 0

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 como RemoteException.
    • 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.

  • 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.

Comments 0 total

    Add comment