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));
}
}
}