0
respostas

Resposta do finalizar compra não retorna para o usuário após chamada assíncrona

Após a mudança para realizar a chamada assíncrona do serviço de pagamento, a tela do usuário fica eternamente em processamento no passo de checkout e a mensagem de que o pagamento efetuado com sucesso não é mostrada bem como o redirecionamento para a tela de index.xhtml não é feito. Como o usuário deve ser notificado do fim da operação?

Outra coisa observada é que o método pagar do serviço externo é chamado com sucesso, mas a execução para logo após a chamada da instrução seguinte de montagem da responseUri, conforme descrito no comentário presente no código abaixo. Por que isto está acontecendo? Como resolver?

package br.com.casadocodigo.services;

import java.net.URI;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;

import br.com.casadocodigo.daos.ComprasDao;
import br.com.casadocodigo.models.Compra;

@Path("/pagamento")
public class PagamentoService {

    @Inject
    PagamentoGateway pagamentoGateway;

    @Inject
    ComprasDao compraDao;

    @Inject
    ServletContext context;

    private static ExecutorService executor = Executors.newFixedThreadPool(50);

    @POST
    public void pagar(@Suspended final AsyncResponse ar, @QueryParam("uuid") String uuid) {

        Compra compra = compraDao.buscarPorUUID(uuid);

        try {

            executor.submit(() -> {

                pagamentoGateway.pagar(compra.getTotal());
// a execução para neste ponto, após o retorno do método pagar.
                URI responseUri = UriBuilder
                        .fromPath("http://localhost:8080" + context.getContextPath() + "/index.xhtml")
                        .queryParam("msg", "Compra realizada com sucesso").build();

                Response response = Response.seeOther(responseUri).build();
                ar.resume(response);
            });
        } catch (Exception e) {
            ar.resume(new WebApplicationException(e));
        }

    }
}