Webservice com resposta parcial e timeout

Pessoal. O intuito deste tópico é mais um brainstorm sobre um cenário hipotético que me questionaram e não soube argumentar a respeito.

Imagina que tenho um serviço de hospedagem (serviço A) que recebe como parâmetros o período de hospedagem e a cidade/estado, onde ao receber os dados, ele executa uma pesquisa em 20 outros serviços de hospedagem de hotéis. Ou seja, cada hotel tem o seu serviço que verifica a disponibilidade da hospedagem e retorna estes dados pro serviço cliente.

Aí entra a questão: o serviço A precisa realizar a consulta em cada um dos 20 hotéis. Tem alguma forma de configurar o serviço A para que ao consultar os outros serviços, ele receba respostas que sejam devolvidas em até 30 segundos? Clareando: libero uma consulta em lote e cada um dos hotéis tem 30 segundos pra responder a requisição. Quem responder em 30s tem os dados publicados, mas quem ultrapassar esse timeout tem a resposta descartada.

Não sei se ficou claro o ponto de vista.

Imagino que sim, em um sistema de Nfce, ao enviar a nota sem internet, ele tenta se comunicar mesmo assim, porém, existe esse timeout de 30~60 segundos coincidentemente o mesmo que seu cenário hipotético.
Entretanto, optei por pingar 8.8.8.8 e verificar conexão primeiro, e nos primeiros 8 segundos já declaro sem conexão, no seu cenário, isso seria facilmente adaptável para verificar se o Hotel 1, 2, 3… possui retorno, isso seria bem mais prático que esperar o timeout.

A melhor arquitetura que me vem a mente é a implementação de uma interface “expirável”.
Vide o vídeo aos 30 minutos e 24 segundos:

Assim, independe do tipo de consulta.
Apenas aguarda um processamento dentro de um determinado espaço de tempo, caso não ocorra ou ocorra parcialmente ao encerrar o tempo, a conexão pode ser fechada e algum processamento pode ser realizado.
No vídeo é argumentado sobre eventos diversos como leilões.
Té+

2 curtidas

Bem bacana!!! Valeu.

1 curtida

@Cid_Marcos, no caso o timeout é uma métrica definida pelo time do serviço. O serviço faz a requisição e espera até 30seg. Se com 30seg tiver algo pendente, é descartado, e somente é processado o resultado que retornou detnro desse período.

Como vc fez na sua emissão de nota?

Só que eventualmente a Sefaz ou o WebService do Amazonas fica lento.
Então primeiro verifico se possui internet, para evitar esse timeout longo, e ai ele transmite em contigência.
mas… se ele ter a resposta ->
> for(int i = 1; i<=6; i++){
> Thread.sleep(800);
> if((Boolean)consulta.get(“autorizado”)){
> System.out.println(“Autorizado na tentativa: “+i+”/6”);
> return consulta;
> }else{
> consulta = consultaEnvioNfe(recibo, xml, codigoUf, ambiente);
> }
> }

Somando as pausas entre cada consulta, dá 7,8s de espera de envio.
Se não tivesse com internet, essa demora seria de 37s.

-> e aqui o código que verifica a internet antes de enviar…

 private boolean ping(){
    Process ping;
    int pesquisa = 0; //Manipulação para evitar return precoce.
        try {
            ping = Runtime.getRuntime().exec("ping 8.8.8.8");
            Scanner leitor = new Scanner(ping.getInputStream());
            while (leitor.hasNextLine()) {
                String retorno = leitor.nextLine();
                System.out.println(retorno);
                if(retorno.contains("Resposta de 8.")){
                    System.out.println("INTERNET SIM");
                    pesquisa = 1;
                    break;
                    //return true;
                }else{
                    if(retorno.equals("")){
                        //System.out.println("DUVIDA NA INTERNET");
                    }else{
                        if(retorno.contains("Disparando 8.8.")){
                            //System.out.println("DUVIDA NA INTERNET");
                        }else{
                            System.out.println("INTERNET NAO");
                            break;
                        }
                    }

                }
                
                
            }  
        } catch (IOException ex) {
            //Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("I-O ERROR: "+ex);
        }
        if(pesquisa == 0){
            return false;
        }else{
            return true;
        }
}