Sou muito novo no Java EE e estou tentando entender o conceito de interfaces locais e interfaces remotas.
Nas versões iniciais da especificação EJB, os EJBs eram "assumidos" como componentes remotos e a única maneira de invocá-los era fazer uma chamada remota, usando a semântica RMI e toda a sobrecarga que isso implica (uma chamada de rede e serialização de objeto para cada chamada de método). Os clientes EJB tiveram que pagar essa penalidade de desempenho mesmo quando colocados na mesma máquina virtual com o contêiner EJB.
Posteriormente, a Sun percebeu que a maioria dos aplicativos de negócios não estava distribuindo EJBs em uma camada diferente e eles corrigiram a especificação (no EJB 2.0) introduzindo o conceito de interfaces locais para que os clientes colocados na mesma máquina virtual com o contêiner EJB possam chamar EJBs usando invocação direta de método, ignorando totalmente a semântica de RMI (e a sobrecarga associada).
Disseram-me que uma das grandes vantagens do Java EE é que é fácil de escalar (o que acredito significa que você pode implantar componentes diferentes em servidores diferentes)
O Java EE pode ser dimensionado, mas isso não significa necessariamente a distribuição de componentes. Você pode executar um aplicativo Web + EJB em um cluster sem separar a camada da Web e a camada EJB.
Você deveria usar interfaces remotas se espera que seu aplicativo tenha componentes diferentes em servidores diferentes? E use interfaces locais se seu aplicativo residir apenas em um servidor?
Eu diria o seguinte: use interfaces remotas se o cliente não estiver na mesma JVM (isso não significa usar apenas um servidor / JVM).
(...) Comece usando interfaces locais e atualize gradualmente para interfaces remotas, quando aplicável?
Eu provavelmente começaria usando interfaces locais. E, como já foi sugerido, a mudança para interfaces remotas nem sempre é obrigatória (você pode agrupar uma estrutura colocada ).
Sugiro verificar os recursos mencionados abaixo (os 2 primeiros são bastante antigos, mas ainda relevantes, os 2 outros são mais recentes).
Recursos
It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?
Sim, é exatamente isso.Do you, by chance know of good books on this topic?
Infelizmente, não, não conheço o recurso absoluto "ZE", se houver um. Eu adicionei mais recursos com algumas referências.Embora eu concorde com a maior parte do que está escrito acima, eu gostaria de refinar um pouco as idéias de "como começar".
Minha sugestão para você é nunca nunca programar diretamente às interfaces EJB dentro de seu código. Sempre use uma interface regular, orientada a negócios, programe-a (ou seja, tenha seus métodos de chamada de código na interface orientada a negócios) e forneça o código de "cola" do EJB como uma implementação conectável. Seu programa deve se concentrar na lógica de negócios, e não nos detalhes da implementação, como EJB.
Dessa forma, você pode alternar facilmente entre implementações remotas e locais - e se você usar um contêiner de IoC, como o Spring, poderá fazê-lo apenas por meio de configuração.
Uma observação especial sobre como mudar de local para remoto: observe que existem algumas diferenças semânticas entre os dois. Por exemplo, chamar um método EJB por meio de sua "interface remota" resulta em argumentos sendo passados por valor, enquanto chamar a "interface local" resulta em argumentos sendo passados por referência. Essa é uma grande diferença; portanto, se você "começar com local", certifique-se de projetar seu sistema de forma que leve em consideração a semântica "remota".
Se o seu design depende de métodos EJB alterando objetos passados, seria difícil para você "mudar para remoto" mais tarde; talvez até impossível.
Boa sorte.
fonte
De acordo com o EJB Spec 3.2, um EJB pode ser local ou remoto . Uma interface de negócios não pode ser local e remota ao mesmo tempo.
@Local
os beans anotados podem ser acessados apenas se estiverem no mesmo aplicativo.@Remote
beans anotados podem ser acessados em diferentes aplicativos, residindo em diferentes jvms ou em servidores de aplicativos.Portanto, as coisas importantes a serem lembradas são:
@Remote
anotação, todas as interfaces implementadas deverão ser remotas.@Local
anotação for especificada, todas as interfaces implementadas serão consideradas locais.fonte
@Local
para chamar um EJB em outro aplicativo (JAR, WAR, EAR), mas a mesma JVM?Isso pode responder às suas preocupações:
Fonte: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text
fonte