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,7 +46,7 @@ class PendenciasTramiteRN extends InfraRN {
46 } 46 }
47 47
48 public function monitorarPendencias() { 48 public function monitorarPendencias() {
49 - try{ 49 + // try{
50 ini_set('max_execution_time','0'); 50 ini_set('max_execution_time','0');
51 ini_set('memory_limit','-1'); 51 ini_set('memory_limit','-1');
52 52
@@ -64,46 +64,51 @@ class PendenciasTramiteRN extends InfraRN { @@ -64,46 +64,51 @@ class PendenciasTramiteRN extends InfraRN {
64 InfraDebug::getInstance()->gravar('MONITORANDO OS TRÂMITES PENDENTES ENVIADOS PARA O RGO (PEN)'); 64 InfraDebug::getInstance()->gravar('MONITORANDO OS TRÂMITES PENDENTES ENVIADOS PARA O RGO (PEN)');
65 echo "[".date("d/m/Y H:i:s")."] Iniciando serviço de monitoramento de pendências de trâmites de processos...\n"; 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 $numIdTramiteRecebido = 0; 68 $numIdTramiteRecebido = 0;
69 $strStatusTramiteRecebido = ''; 69 $strStatusTramiteRecebido = '';
70 $numQuantidadeErroTramite = 0; 70 $numQuantidadeErroTramite = 0;
71 $arrQuantidadeErrosTramite = array(); 71 $arrQuantidadeErrosTramite = array();
72 72
  73 +
  74 +
73 //TODO: Tratar quantidade de erros o sistema consecutivos para um tramite de processo 75 //TODO: Tratar quantidade de erros o sistema consecutivos para um tramite de processo
74 //Alcanado est quantidade, uma pendncia posterior dever ser obtida do barramento 76 //Alcanado est quantidade, uma pendncia posterior dever ser obtida do barramento
  77 + echo "\nIniciando monitoramento de pendências";
75 while (true) { 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 $numSeg = InfraUtil::verificarTempoProcessamento($numSeg); 100 $numSeg = InfraUtil::verificarTempoProcessamento($numSeg);
96 InfraDebug::getInstance()->gravar('TEMPO TOTAL DE EXECUCAO: '.$numSeg.' s'); 101 InfraDebug::getInstance()->gravar('TEMPO TOTAL DE EXECUCAO: '.$numSeg.' s');
97 InfraDebug::getInstance()->gravar('FIM'); 102 InfraDebug::getInstance()->gravar('FIM');
98 LogSEI::getInstance()->gravar(InfraDebug::getInstance()->getStrDebug()); 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 private function configurarRequisicao() 114 private function configurarRequisicao()
@@ -117,48 +122,91 @@ class PendenciasTramiteRN extends InfraRN { @@ -117,48 +122,91 @@ class PendenciasTramiteRN extends InfraRN {
117 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 122 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
118 curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalizacaoCertificadoDigital); 123 curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalizacaoCertificadoDigital);
119 curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strSenhaCertificadoDigital); 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 return $curl; 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 private function enviarPendenciaFilaProcessamento($objPendencia) 212 private function enviarPendenciaFilaProcessamento($objPendencia)