Em meus testes estudando o GWT não tive nenhum problema para executar chamadas à serviços remotos (RPC). Fiquei entretanto com algumas dúvidas quanto à maneira certa de usar esse recurso.
1: Só dá para fazer RPC assíncrona?
2: Devido ao fato de chamdas assíncronas serem “non-blocking”, como posso ter certeza de que, ao terminar a chamada, o objeto AsyncCallback usado pode imediatamente executar?
3: Para que serve a classe DeferredCommand? Utilizei-a sem problemas mas não entendi bem porque ela foi necessária.
Quanto à segunda questão, explico: na documentação é dito que chamadas assíncronas são boas de serem usadas porque ganham tempo fazendo duas tarefas paralelas; uma executando a chamada ao servidor e a outra “adiantando” tarefas cujos resultados serão úteis quando a chamada tiver se completado. A minha questão é: como posso sincronizar esse eventos se não há como sincronizar threads no GWT? Alguém entendeu isso melhor? Obrigado.
De acordo com artigo na Mundo Java 39 só é possível fazer requisições assíncronas. Mas de acordo com este artigo é possível fazer requisições síncronas.
Não faz sentido fazer requisições síncronas, pois elas bloqueariam a janela do browser da mesma forma que uma consulta ao banco feita na Thread EDT do Swing bloquearia a aplicação, efeito longe do esperado. A única coisa que pode ser feita (presumo que é isso que é discutido na revista indicada pelo colega) é uma simulação de sincronia, algo que bloqueie a execução dos Scripts até que o callback seja chamado.
Pergunta número 2:
O seu AsyncCallback deve sempre estar pronto para executar a partir do momento que chamou a RPC, esta dica da documentação é apenas para tarefas paralelas que não envolvem a chamada, se precisar criar um controle por exemplo, tem que ser antes da chamada ou dentro do callback, nunca após o RPC, pois isso cria uma condição de corrida entre o client e o retorno do servidor.
Pergunta número 3:
Apenas para agendar comandos que não se relacionam para serem executados após um determinado tempo ou “assim que possível”, pode ser comparado de certa forma com o SwingUtilities.invokeLater().