Commit 741fcd335778efce7391c461068d6e041d44e373

Authored by Guilherme Andrade Del Cantoni
1 parent 98f775ac

Correção inicial de problema de processo no limbo pelo serviço de pendâncias

Showing 1 changed file with 103 additions and 55 deletions   Show diff stats
rn/PendenciasTramiteRN.php
... ... @@ -46,7 +46,7 @@ class PendenciasTramiteRN extends InfraRN {
46 46 }
47 47  
48 48 public function monitorarPendencias() {
49   - try{
  49 + // try{
50 50 ini_set('max_execution_time','0');
51 51 ini_set('memory_limit','-1');
52 52  
... ... @@ -64,46 +64,51 @@ class PendenciasTramiteRN extends InfraRN {
64 64 InfraDebug::getInstance()->gravar('MONITORANDO OS TRÂMITES PENDENTES ENVIADOS PARA O RGO (PEN)');
65 65 echo "[".date("d/m/Y H:i:s")."] Iniciando serviço de monitoramento de pendências de trâmites de processos...\n";
66 66  
67   - try{
  67 + // try{
68 68 $numIdTramiteRecebido = 0;
69 69 $strStatusTramiteRecebido = '';
70 70 $numQuantidadeErroTramite = 0;
71 71 $arrQuantidadeErrosTramite = array();
72 72  
  73 +
  74 +
73 75 //TODO: Tratar quantidade de erros o sistema consecutivos para um tramite de processo
74 76 //Alcanado est quantidade, uma pendncia posterior dever ser obtida do barramento
  77 + echo "\nIniciando monitoramento de pendências";
75 78 while (true) {
76   - $objPendenciaDTO = $this->obterPendenciasTramite($numIdTramiteRecebido);
77   - if(isset($objPendenciaDTO)) {
78   - if($numIdTramiteRecebido != $objPendenciaDTO->getNumIdentificacaoTramite() ||
79   - $strStatusTramiteRecebido != $objPendenciaDTO->getStrStatus()) {
80   - $numIdTramiteRecebido = $objPendenciaDTO->getNumIdentificacaoTramite();
81   - $strStatusTramiteRecebido = $objPendenciaDTO->getStrStatus();
82   - $this->enviarPendenciaFilaProcessamento($objPendenciaDTO);
83   - }
  79 + echo "\n Obtendo lista de pendências";
  80 + $arrObjPendenciasDTO = $this->obterPendenciasTramite();
  81 + foreach ($arrObjPendenciasDTO as $objPendenciaDTO) {
  82 + InfraDebug::getInstance()->gravar(sprintf("[".date("d/m/Y H:i:s")."] Iniciando processamento do trâmite %d com status %s",
  83 + $objPendenciaDTO->getNumIdentificacaoTramite(), $objPendenciaDTO->getStrStatus()));
  84 +
  85 + echo sprintf("\n Enviando pendência %d com status %s", $objPendenciaDTO->getNumIdentificacaoTramite(), $objPendenciaDTO->getStrStatus());
  86 + $this->enviarPendenciaFilaProcessamento($objPendenciaDTO);
84 87 }
85   - sleep(5);
  88 +
  89 + echo "\nReiniciando monitoramento de pendências";
  90 + sleep(5);
86 91 }
87   - }
88   - //TODO: Urgente: Tratar erro especfico de timeout e refazer a requisio
89   - catch(Exception $e) {
90   - $strAssunto = 'Erro monitorando pendências.';
91   - $strErro = InfraException::inspecionar($e);
92   - LogSEI::getInstance()->gravar($strAssunto."\n\n".$strErro);
93   - }
  92 + // }
  93 + // //TODO: Urgente: Tratar erro especfico de timeout e refazer a requisio
  94 + // catch(Exception $e) {
  95 + // $strAssunto = 'Erro monitorando pendências.';
  96 + // $strErro = InfraException::inspecionar($e);
  97 + // LogSEI::getInstance()->gravar($strAssunto."\n\n".$strErro);
  98 + // }
94 99  
95 100 $numSeg = InfraUtil::verificarTempoProcessamento($numSeg);
96 101 InfraDebug::getInstance()->gravar('TEMPO TOTAL DE EXECUCAO: '.$numSeg.' s');
97 102 InfraDebug::getInstance()->gravar('FIM');
98 103 LogSEI::getInstance()->gravar(InfraDebug::getInstance()->getStrDebug());
99 104  
100   - }
101   - catch(Exception $e) {
102   - InfraDebug::getInstance()->setBolLigado(false);
103   - InfraDebug::getInstance()->setBolDebugInfra(false);
104   - InfraDebug::getInstance()->setBolEcho(false);
105   - throw new InfraException('Erro processando pendências de integração com o PEN - Processo Eletrônico Nacional.',$e);
106   - }
  105 + // }
  106 + // catch(Exception $e) {
  107 + // InfraDebug::getInstance()->setBolLigado(false);
  108 + // InfraDebug::getInstance()->setBolDebugInfra(false);
  109 + // InfraDebug::getInstance()->setBolEcho(false);
  110 + // throw $e;
  111 + // }
107 112 }
108 113  
109 114 private function configurarRequisicao()
... ... @@ -117,48 +122,91 @@ class PendenciasTramiteRN extends InfraRN {
117 122 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
118 123 curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalizacaoCertificadoDigital);
119 124 curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strSenhaCertificadoDigital);
120   - curl_setopt($curl, CURLOPT_TIMEOUT, 60); //timeout in seconds
  125 + curl_setopt($curl, CURLOPT_TIMEOUT, 6000);
121 126 return $curl;
122 127 }
123 128  
124   - private function obterPendenciasTramite($parNumIdTramiteRecebido)
  129 +
  130 + /**
  131 + * Função para recuperar as pendências de trâmite que já foram recebidas pelo serviço de long pulling e não foram processadas com sucesso
  132 + * @param num $parNumIdTramiteRecebido
  133 + * @return [type] [description]
  134 + */
  135 + private function obterPendenciasTramite()
125 136 {
126   - $resultado = null;
127   - $curl = $this->configurarRequisicao();
  137 + //Obter todos os trâmites pendentes antes de iniciar o monitoramento
  138 + $arrPendenciasRetornadas = array();
  139 + $objProcessoEletronicoRN = new ProcessoEletronicoRN();
  140 + $arrObjPendenciasDTO = $objProcessoEletronicoRN->listarPendencias(false) or array();
  141 +
  142 + echo sprintf("\n Recuperando todas as pendências do barramento: " . count($arrObjPendenciasDTO));
  143 + foreach ($arrObjPendenciasDTO as $objPendenciaDTO) {
  144 + //Captura todas as pendências e status retornadas para impedir duplicidade
  145 + $arrPendenciasRetornadas[] = sprintf("%d-%s", $objPendenciaDTO->getNumIdentificacaoTramite(), $objPendenciaDTO->getStrStatus());
  146 + yield $objPendenciaDTO;
  147 + }
128 148  
129   - try{
130   - if(isset($parNumIdTramiteRecebido)) {
131   - curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias . "?idTramiteDaPendenciaRecebida=" . $parNumIdTramiteRecebido);
132   - }
  149 + //Obter demais pendências do serviço de long pulling
  150 + $bolEncontrouPendencia = false;
  151 + $numUltimoIdTramiteRecebido = 0;
133 152  
134   - //A seguinte requisio ir aguardar a notificao do PEN sobre uma nova pendncia
135   - //ou at o lanamento da exceo de timeout definido pela infraestrutura da soluo
136   - //Ambos os comportamentos so esperados para a requisio abaixo.
137   - $strResultadoJSON = curl_exec($curl);
  153 + $arrObjPendenciasDTONovas = array();
  154 + echo "\n Iniciando monitoramento no serviço long pulling";
  155 + do {
  156 + $curl = $this->configurarRequisicao();
  157 + try{
138 158  
139   - if(curl_errno($curl)) {
140   - if (curl_errno($curl) != 28)
141   - throw new InfraException("Erro na requisição do serviço de monitoramento de pendências. Curl: " . curl_errno($curl));
142   - }
  159 + curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias . "?idTramiteDaPendenciaRecebida=" . $numUltimoIdTramiteRecebido);
  160 +
  161 + //A seguinte requisio ir aguardar a notificao do PEN sobre uma nova pendncia
  162 + //ou at o lanamento da exceo de timeout definido pela infraestrutura da soluo
  163 + //Ambos os comportamentos so esperados para a requisio abaixo.
  164 + echo sprintf("\n Executando requisição de pendência com IDT %d", $numUltimoIdTramiteRecebido);
  165 + $strResultadoJSON = curl_exec($curl);
143 166  
144   - if(!InfraString::isBolVazia($strResultadoJSON)) {
145   - $strResultadoJSON = json_decode($strResultadoJSON);
  167 + if(curl_errno($curl)) {
  168 + if (curl_errno($curl) != 28)
  169 + throw new InfraException("Erro na requisição do serviço de monitoramento de pendências. Curl: " . curl_errno($curl));
146 170  
147   - if(isset($strResultadoJSON) && $strResultadoJSON->encontrou) {
148   - $objPendenciaDTO = new PendenciaDTO();
149   - $objPendenciaDTO->setNumIdentificacaoTramite($strResultadoJSON->IDT);
150   - $objPendenciaDTO->setStrStatus($strResultadoJSON->status);
151   - $resultado = $objPendenciaDTO;
  171 + $bolEncontrouPendencia = false;
  172 + echo "\n*** TIMEOUT FORÇADO ***";
152 173 }
  174 +
  175 + if(!InfraString::isBolVazia($strResultadoJSON)) {
  176 + $strResultadoJSON = json_decode($strResultadoJSON);
  177 +
  178 + if(isset($strResultadoJSON) && isset($strResultadoJSON->encontrou) && strtolower($strResultadoJSON->encontrou) == true) {
  179 + $bolEncontrouPendencia = true;
  180 + $numUltimoIdTramiteRecebido = $strResultadoJSON->IDT;
  181 + $strChavePendencia = sprintf("%d-%s", $strResultadoJSON->IDT, $strResultadoJSON->status);
  182 + $objPendenciaDTO = new PendenciaDTO();
  183 + $objPendenciaDTO->setNumIdentificacaoTramite($strResultadoJSON->IDT);
  184 + $objPendenciaDTO->setStrStatus($strResultadoJSON->status);
  185 +
  186 + //Não processo novamente as pendências já capturadas na consulta anterior ($objProcessoEletronicoRN->listarPendencias)
  187 + //Considera somente as novas identificadas pelo serviço de monitoramento
  188 + if(!in_array($strChavePendencia, $arrPendenciasRetornadas)){
  189 + $arrObjPendenciasDTONovas[] = $strChavePendencia;
  190 + yield $objPendenciaDTO;
  191 +
  192 + } elseif(in_array($strChavePendencia, $arrObjPendenciasDTONovas)) {
  193 + // Sleep adicionado para minimizar problema do serviço de pendência que retorna o mesmo código e status
  194 + // inúmeras vezes por causa de erro ainda não tratado
  195 + echo sprintf("\n IDT %d desconsiderado por retorno sucessivo pelo barramento", $numUltimoIdTramiteRecebido);
  196 + sleep(5);
  197 + } else {
  198 + echo sprintf("\n IDT %d desconsiderado por já ter sido retornado na consulta inicial", $numUltimoIdTramiteRecebido);
  199 + }
  200 + }
  201 + }
  202 + } catch (Exception $e) {
  203 + $bolEncontrouPendencia = false;
  204 + throw new InfraException("Erro processando monitoramento de pendências de trâmite de processos", $e);
  205 + }finally{
  206 + curl_close($curl);
153 207 }
154   - }
155   - catch(Exception $e){
156   - curl_close($curl);
157   - throw $e;
158   - }
159 208  
160   - curl_close($curl);
161   - return $resultado;
  209 + } while($bolEncontrouPendencia);
162 210 }
163 211  
164 212 private function enviarPendenciaFilaProcessamento($objPendencia)
... ...