Ir para conteúdo
  • Cadastre-se

dev botao

MFE - Erro /Timeout de resposta do "envia comando"


  • Este tópico foi criado há 2232 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

1. Alguma situações o Integrador devolve uma resposta de Erro por conta de formatação com Erro no pacote de requisição - não há nenhum ponto para recuperar este e erro, já que o código esta esperando um erro de resposta da operação e não de erro no pacato de requisição.

// pegar erro de validação do dado no envio do pacote ao integrador - Amarildo Lacerda
  Erro := LerTagXML(RespostaIntegrador, 'Erro', True);
  if Erro <> '' then
    DoException(Erro);


2. Constatamos um número muito elevado de situações que o "Integrador" não devolve a resposta da operação após ter capturado a XML de requisição...

Fluxo:
   1) aplicação gera o XML de requisição;
   2) o integrador pega o XML;

   .... não devolve nenhum retorno e entra em  "timeout";


Para avaliar a questão estamos testando a possibilidade de reenviar o mesmo pacote com os mesmos dados. Estamos ainda para avaliar se isto poderá gerar duplicidade do mesmo dado no MFE (não tenho resposta segura ainda);

Como estamos fazendo isto:

- incluído um contador de insucesso ao obter a resposta;

- a cada insucesso incrementa o contador;

- depois de um número de insucessos, gera novamente o arquivo com os mesmos dados.
 

<code>

unit ACBrIntegrador;
....

function TComandoIntegrador.EnviaComando(numeroSessao: Integer;
  Nome, Comando: String; TimeOutComando: Integer = 0): String;
var
  LocTimeOut, ActualTime, TimeToRetry: TDateTime;
  NomeArquivoXml, RespostaIntegrador: String;
  ATimeout: Integer;

  function CriarXml(NomeArquivo, Comando: String): String;
  var
    NomeArquivoTmp, NomeArquivoXml: String;
  begin
    NomeArquivoTmp := ChangeFileExt(NomeArquivo, '.tmp');
    FOwner.DoLog('Criando arquivo: ' + NomeArquivoTmp);

    WriteToFile(NomeArquivoTmp, Comando);

    if not FileExists(NomeArquivoTmp) then
      DoException('Erro ao criar o arquivo: ' + NomeArquivoTmp);

    NomeArquivoXml := ChangeFileExt(NomeArquivoTmp, '.xml');
    FOwner.DoLog('Renomeando arquivo: ' + NomeArquivoTmp + ' para: ' +
      NomeArquivoXml);
    if not RenameFile(NomeArquivoTmp, NomeArquivoXml) then
      DoException('Erro ao renomear o arquivo: ' + NomeArquivoTmp + ' para: ' +
        NomeArquivoXml);

    Result := NomeArquivoXml;
  end;

var
  Erro: string;
  conta: Integer;
begin
  Result := '';
  Clear;
  conta := 0;

  // NomeArquivoXml := CriarXml(FPastaInput + LowerCase(Nome) + '-' +
  // IntToStr(numeroSessao), Comando);
  NomeArquivoXml := CriarXml(FPastaInput + LowerCase(Nome) + '-' +
    IntToStr(numeroSessao) + '-' + FormatDateTime('HHNNSS',
    ActualTime), Comando);

  // somente para debug --- remover
  // seria interessante ter um evento para gravar o conteúdo enviado -
  WriteToFile(ChangeFileExt(NomeArquivoXml, '.env'), Comando);

  ActualTime := Now;
  TimeToRetry := IncSecond(ActualTime, 3);
  if (TimeOutComando > 0) then
    ATimeout := TimeOutComando
  else
    ATimeout := FTimeout;

  if (ATimeout <= 0) then
    ATimeout := 100;

  LocTimeOut := IncSecond(ActualTime, ATimeout);

  RespostaIntegrador := AguardaArqResposta(numeroSessao);
  while EstaVazio(RespostaIntegrador) and (ActualTime < LocTimeOut) do
  begin
    Sleep(150);
    RespostaIntegrador := AguardaArqResposta(numeroSessao);
    ActualTime := Now;
    if ActualTime > TimeToRetry then
    // Caso arquivo ainda não tenha sido consumido após 5 segundos, recria o arquivo
    begin
      // se tentou e não retornou nenhum dado... renenviar
      inc(conta);
      TimeToRetry := IncSecond(ActualTime, 3);
      if (FilesExists(NomeArquivoXml)) or (conta > 2) then
      begin
        try
          FOwner.DoLog('Apagando arquivo não processado: ' + NomeArquivoXml);
          DeleteFile(NomeArquivoXml);
        except
        end;

        NomeArquivoXml := CriarXml(FPastaInput + LowerCase(Nome) + '-' +
          IntToStr(numeroSessao) + '-' + FormatDateTime('HHNNSS',
          ActualTime), Comando);
        conta := 0;
      end;
    end;
  end;

  /// somente para debug - remover
  /// remove o arquivo gerado para DEBUG... houve sucesso
  if (not EstaVazio(RespostaIntegrador)) and FileExists(debug) then
    DeleteFile(debug);

  if FilesExists(NomeArquivoXml) then
  // Apaga arquivo não tratado pelo Integrador
  begin
    FOwner.DoLog('Apagando arquivo: ' + NomeArquivoXml);
    DeleteFile(NomeArquivoXml);
  end;

  if EstaVazio(RespostaIntegrador) then
  begin
    FErroTimeout := True;
    DoException('Sem Resposta do Integrador');
  end;

  // pegar erro de validação do dado no envio do pacote ao integrador - Amarildo Lacerda
  Erro := LerTagXML(RespostaIntegrador, 'Erro', True);
  if Erro <> '' then
    DoException(Erro);


  FOwner.DoLog('RespostaIntegrador: ' + RespostaIntegrador);
  FResposta := RespostaIntegrador;
  FIntegradorResposta.LerResposta(RespostaIntegrador);
  Result := PegaResposta(RespostaIntegrador);
end;
</code>

 

Amarildo Lacerda

Storeware Team

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2232 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...