Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Resultado Assíncrono em HttpClient não funcionou

Na aula, o professor fez uma conexão assíncrona com o HttpClient e exibiu o retorno na tela com System.out.

Tentei fazer o mesmo, mas o retorno não é exibido.

Segue o código:

CompletableFuture<HttpResponse<String>> retorno = client.sendAsync(request, HttpResponse.BodyHandler.asString())
                .whenComplete((response, message) -> System.out.println("RESULTADO ASSÍNCRONO: " + response.body()));

Procurando na Internet, encontrei esse exemplo de conexão assíncrona e gostaria de saber se o mesmo funciona de modo similar ao que foi ensinado na aula:

client.sendAsync(request, HttpResponse.BodyHandler.asString())
          .thenApply((response) -> response.body())
          .thenAccept((retorno) -> System.out.println("*****\nRESULTADO ASSÍNCRONO: " + retorno))
          .join();

Link de onde peguei o exemplo: https://openjdk.java.net/groups/net/httpclient/intro.html

Obs.: eu rodei com esse código que peguei na internet e funcionou corretamente. Apenas gostaria de saber se dessa forma eu garanto o modo assíncrono, tratando o retorno em thenAccept().

Bem, é isso.

Obrigado desde já pessoal.

4 respostas

Thiago, bom dia. Está acontecendo algum erro? Qual é o cenário?

Atenciosamente, João Victor.

Opa, boa noite. Peço desculpas pela demora na resposta.

Curiosamente, não retorna erro algum. Na verdade, parece que o método whenComplete(...) não está sendo chamado/executado, ou alguma coisa do tipo. Pelo que foi ensinado em aula, a resposta deveria ser exibida quando whenComplete(...) fosse executado, o que parece não ocorrer.

Como comentei na descrição do meu problema, utilizei uma forma de comunicação que utiliza thenApply(...), thenAccept(...) e finaliza com uma chamada de join().

Dessa forma, obtenho a resposta da requisição e a exibo em tela com a chamada de thenAccept(...).

Minhas dúvidas são: 1) o que poderia estar ocorrendo para que o código ensinado em aula não funcione adequadamente? Poderia ser versão de alguma coisa? 2) a forma de comunicação e manipulação de resposta das comunicações (que encontrei na web), merecem algum ponto de atenção?

Bem, é isso.

Obrigado desde já e forte abraço.

solução!

Thiago, bom dia. O que pode estar acontecendo é a finalização da execução do programa antes do retorno do método whenComplete (Lembrando que quando utilizamos o sendAsync a execução do programa fica paralelizada). Na sua classe principal, você pode colocar este trecho de código

Scanner scan = new Scanner(System.in);
scan.nextLine();
scan.close();

Vamos analisar se com isso a execução do programa fica normal. Referente às outras opções que você colocou, a execução está se dando de forma paralela? Você consegue ver a execução do programa em duas threads distintas? Caso sim, então não há nenhum problema na abordagem, pois poderemos utilizar outros métodos de CompletableFuture além do whenComplete. =)

Problema resolvido! Era isso mesmo. Obrigado!