Pessoal, preciso desenvolver uma aplicação Desktop com Swing e eu gostaria de centralizar os procedimentos num servidor e fazer as máquinas clientes enviarem suas requisições para este servidor tratar e lhes devolter tudo mastigado devolta.
Pesquisei muito no fórum e no google durante alguns dias mas ainda não cheguei a uma conclusão do que seria melhor de usar neste situação.
Vi recomendações para Web Services, HttpClient/URLConnection, EJB (Vi muita gente jogando pedras tb), RMI, bla bla bla, etc…
Pois bem, em nenhum caso encontrei material suficiente para entender como cada uma funciona (O que mais encontrei é Web Services).
Montei um Web Service com Apache Axis (achei bastante fácil) e consumi este WS numa aplicação bem simples usando Swing.
Pois bem, meus problemas estariam resolvidos exceto pelo fato das seguintes questões :
1 ) Web Service é recomendado para este tipo de situação ? ( Cliente / Servidor em Java ).
2 ) Como eu poderia tratar da segurança usando Web Service ? ( Gostaria de evitar que qqer um tenha acesso aos meus métodos, fora da minha aplicação, sei que isso pode ser paranóia, mas já que é pra fazer, melhor fazer bem feito ).
3 ) E o ponto em que fiquei mais em dúvida, Web Service tornaria minha aplicação lenta caso ela fosse bastante solicitada em vários terminais simultâneos por exemplo ?
A princípio minha aplicação não será usada na WEB, é uma aplicação interna da empresa, portanto a vantagem do Web Service não teria serventia neste caso.
Pode usar sem problemas. Ainda mais que é uma aplicação interna, onde não deve haver problemas de latência de rede.
Você poderia criar um web service login e uma chave de sessão (que deve ser enviada nas próximas requisições), e se não for muito difícil, usar https (SSL) em vez de http. Não é preciso usar aquela parafernália de WS-Security (WS-Encryption, WS-Signature) que no seu caso não deve ser necessário.
Depende de como você criou seu web service.
Como você sabe, o melhor web service é aquele que recebe todos os dados de entrada de uma vez e retorna todos os resultados de uma vez (exceto no caso de paginação, é claro).
Se seu web service é estúpido (ou seja, é só uma casca muito fina sobre uma classe Java, tendo métodos separados para getters e setters) então você vai estar em maus bocados.
Você pode passar e retornar objetos complexos através de web services. Mas a passagem de objetos “por referência” em vez de "por valor’ pode dar problemas.
Aliás é normalmente assim que se faz:
criar um objeto grandão contendo todos os dados necessários como um parâmetro, chamar o web service, e este
criar outro objeto contendo todos os valores de retorno. Essas classes são específicas para passar parâmetros ou receber parâmetros desse web service.
Só tomar o seguinte cuidado: você não pode, normalmente, passar um ArrayList<Cliente> para um Web Service ou retornar um ArrayList<Cliente>. Isso dá problemas de interoperabilidade (exemplo: Java x .NET x PHP, ou então mesmo Java x Java).
Você tem de converter seu ArrayList<Cliente> para um Cliente[] e vice/versa. Outras estruturas de dados, como HashMap ou TreeMap, também dão problemas de interoperabilidade; melhor usar os velhos e antiquados arrays.
Normalmente se você só trabalhar com String, double e int é suficiente; tipos mais complicados podem dar problemas com outras linguagens.
Acho que eu ainda iria usar Web Service (não precisa ser SOAP, pode ser REST, que costuma ser mais rápido e eficiente, e mais fácil de implementar), principalmente porque o servidor não precisa ter um cliente Java. Ou seja, EJB com acesso remoto e RMI estariam fora de questão, e sockets puros normalmente dão mais problemas* que soluções - principalmente se o sistema não vai ser mantido por você, e sim por outra pessoa.
Em particular eu não recomendaria usar ObjectInput/OutputStream como um encapsulamento simples sobre sockets. Eu já vi gente ser demitida por causa disso; não cometa o mesmo erro.
Eu só gostaria de saber se vc tem alguma recomendação sobre algum outro framework para geração de WS que não fosse o Axis.
Gostei do Axis, mas eu gostaria de ter mais liberdade caso seja necessário mudar de servidor, e como vi no axis, se eu fizer isso terei que recompilar minhas classes clientes de acesso ao WS para apontarem para o novo endereço do servidor.
Eu gostaria de algo mais prático. Por exemplo um arquivo de config onde eu seto o servidor.