Chamadas Remotas - App Desktop

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.

Agradeço muito a quem puder me ajudar.

  1. Pode usar sem problemas. Ainda mais que é uma aplicação interna, onde não deve haver problemas de latência de rede.
  2. 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.
  3. 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.

Obrigado thingol.

Você indicaria eu dar uma olhada em mais alguma alternativa ?

Tipo, para este tipo de situação, normalmente usa-se… ???

E outra dúvida, é possível passar por parametro ou retornar algum objeto atravez de um web service ?

Digo isso pois fiquei em duvida no seguinte:
Tenho um WS feito em Java que retorna um tipo em java, como em php eu interpretaria aquele retorno ?

Obrigado.

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.

Ok, thingol, obrigado pelas respostas.

Sendo chato na pergunta novamente. Se você fosse implementar uma aplicação deste tipo o que usaria se não fosse usar Web Service ?

Estou procurando alternativas mais “profissionais”.

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.

Se for usar Spring, pode usar remoting:
http://static.springframework.org/spring/docs/2.0.x/reference/remoting.html

Mas tudo que o thingol falou, está mapeado em algum dos modos do remoting.

Thingol, obrigado mais uma vez.

Vou adotar WS como estratégia.

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.

É possível ou estou viajando ?

Obrigado!