Tenho uma aplicação desenvolvida com EJB e agora tenho que desenvolver um client swing para a mesma, porém tenho algumas dúvidas.
1- Na aplicação Swing bastaria eu ter acesso a uma interface remota dos EJBs para utiliza-los. Considerando que o acesso será pela internet e que não tenho outra opção senão o Swing, existe alguma boa pratica a ser seguida? Alias, é recomendável fazer isso? Existem alternativas?
Eu já vi isso em funcionamento mas dentro de uma intranet, tenho dúvidas disso funcionando remotamente através da internet…
2- Por curiosidade, se a aplicação estivesse em um servidor de aplicação mas não usasse EJB, como poderia fazer esse acesso remoto com swing, além é claro do uso de webservices? Existem alternativas?
Algo importante q vc precisa ter em mente é o uso do padrão Service Facade. Isso pq é preciso q vc exponha as funcionalidades dos seus EJBs através de uma interface com granularidade grossa já q chamadas através da rede tem um custo alto. Um problema q eu já ouvi falar, embora nunca tenha visto, é q alguns firewalls podem bloquear o protocolo corba q é usado p/ o acesso remoto de EJBs. Eu ñ conheço nenhuma outra alternativa além dos EJBs remotos e de webservices.
Algumas alternativas a EJBs e Web Services (imagino que nesse caso você se refira a JAX-WS) para acesso remoto a recursos:
RMI puro
JMS
Spring HTTP Invoker, se você usa Spring
Burlap/Hessian, se você usa o Resin…
FTP
SMTP
Protocolo proprietário (do it yourself)
DPL/DPC (esse é old school…)
Basicamente, o que você precisa é de um protocolo que permita você enviar e receber informação através de uma interface de rede. Que protocolo você vai usar, depende do seu projeto.
Meu receio é se essa é a melhor solução, pois tenho preocupações referentes a performance principamente.
Lembrando que o client swing vai acessar os EJBs remotamente via internet, não em uma rede local. Por isso minha preocupação é grande, já que a troca de dados será grande, e o número de clients também.
Eu sei que a pergunta é vaga, mas gostaria de contar com a experiencia de voces para saber se existe alguma boa pratica a ser seguida nesse caso para minimizar problemas de trafego de dados por exemplo.
Um dos amigos citou o uso de um sevice facade, legal, isso acho que não deve deixar de ter. Esse tipo de dica será muito bem-vinda.
Se a preocupação é performance e volume de dados acredito que deveria se levar em conta o seguinte:
Uso de DTOs. Se vc estiver utilizando JPA/Hibernate você irá achar feio e esquisito e etc… mas deve considerar este padrão neste caso mediante análise.
Ejb stateless; com isso talvez você consiga reduzir os sinais de comunição entre os proxys dos ejbs. Fora o número reduzido de sessões longas no servidor.
Objetos serializados em formato xml; Spring HTTP Invoker Burlap/Hessian indicado pelo esmiralha acredito que ajude. Como isso acho que vc não irá precisar de proxys no lado client o que vai melhorar a performance e o tráfico na rede.
Na minha opinião, o ideal seria fazer tudo no navegador, com JSP ou JSF.
Se eu estivesse na sua posição, consideraria levar em conta e fazer um estudo a fundo de três coisas:
JMS;
Webservice;
Burlap/Hessian do Spring.
Mas sinceramente? Não vejo porque não fazer da mesma forma como você faria na web… Poderia usar um pattern tipo ServiceLocator e fazer alguns testes. Se não ficar bom você pode testar os outros.
Se tem que ter swing no client e o acesso será via internet, esqueça acessar as interfaces remotas dos EJBs diretamente.
Isto porque EJB utiliza Java RMI e você vai ter restrição nos firewalls.
Além disso, é pouco provável que os EJBs tenham sido contruídos considerando estas requisições remotas. Então, eles devem ter um conjunto de métodos de granularidade fina e você terá infinitas requisições correndo na rede, com sérios problemas de perfomance.
Sugiro que você crie um façade no web server, que recebe as requisições do swing e as propague para os EJBS. Para a comunicação entre o SWING e o façade, utilizaria WS-RESTful que é leve e passa tranquilo pelos firewalls.
[quote=Andre Brito]Na minha opinião, o ideal seria fazer tudo no navegador, com JSP ou JSF.
Se eu estivesse na sua posição, consideraria levar em conta e fazer um estudo a fundo de três coisas:
JMS;
Webservice;
Burlap/Hessian do Spring.
Mas sinceramente? Não vejo porque não fazer da mesma forma como você faria na web… Poderia usar um pattern tipo ServiceLocator e fazer alguns testes. Se não ficar bom você pode testar os outros.[/quote]
Andre,
O projeto requer dois clients distintos, um desenvolvido na WEB provavelmente desenvolvido com JSF, e outro com Swing. Por isso o uso dos EJB’s para desenvolver a parte de negócio, e facilitar o uso de diversos clients.
[quote=luizSC]Se tem que ter swing no client e o acesso será via internet, esqueça acessar as interfaces remotas dos EJBs diretamente.
Isto porque EJB utiliza Java RMI e você vai ter restrição nos firewalls.
[/quote]
Esse ponto é bastante nebuloso. Uns falam que teria problemas com firewall, outros não. Vale lembrar que o projeto rodará em cima de uma infra que será definida dentro de casa, logo, acredito que esse tipo de problema seja facilmente contornado.
Os EJB’s não foram construídos ainda. Mas essa é uma boa dica. Para esse acesso remoto, diminuir a granularidade dos métodos pode ajudar a melhorar a performance.
[quote=luizSC]
Sugiro que você crie um façade no web server, que recebe as requisições do swing e as propague para os EJBS. Para a comunicação entre o SWING e o façade, utilizaria WS-RESTful que é leve e passa tranquilo pelos firewalls.
Abraços[/quote]
Nunca ouvi falar disso. Se puder dar mais detalhes eu agradeço.