Ir para conteúdo
  • Cadastre-se

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

Recommended Posts

Postado

Pessoal, ao enviar qualquer comando com o integrador fechada o acbr respeita o tempo de timeout

Porém ao enviar os dados venda, e fechar o integrador, é como se bugasse esse timeout e fica em um loop infinito dentro do while da função:

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;

begin
  Result := '';
  Clear;

  NomeArquivoXml := CriarXml( FPastaInput + LowerCase(Nome) + '-' + IntToStr(numeroSessao),
                              Comando);
  ActualTime  := Now;
  TimeToRetry := IncSecond(ActualTime,5);
  if (TimeOutComando > 0) then
    ATimeout := TimeOutComando
  else
    ATimeout := FTimeout;

  if (ATimeout <= 25) then
    ATimeout := 25;

  LocTimeOut := IncSecond(ActualTime, ATimeout);

  RespostaIntegrador := AguardaArqResposta(numeroSessao);
  while EstaVazio(RespostaIntegrador) and (ActualTime < LocTimeOut) do // Fica em loop aqui ao fechar integrador no enviardadosvenda
  begin
    Sleep(100);
    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
      TimeToRetry := IncSecond(ActualTime,5);
      if FilesExists(NomeArquivoXml) 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);
      end;
    end;
  end;

  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;

  FOwner.DoLog('RespostaIntegrador: '+RespostaIntegrador);
  FResposta:= RespostaIntegrador;
  FIntegradorResposta.LerResposta(RespostaIntegrador);
  if (FIntegradorResposta.Codigo <> 'EE') then
    Result := PegaResposta(FResposta)
  else
    Result := FResposta;
end;

É bem fácil de reproduzir o erro, é só no momento de enviar a função: enviardadosvenda fechar o integrador (isso fara com que ele não retorne nenhuma resposta e fique em loop sem obedecer ao timeout)

  • Este tópico foi criado há 2464 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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...
The popup will be closed in 10 segundos...