Commit 741fcd335778efce7391c461068d6e041d44e373
1 parent
98f775ac
Exists in
master
and in
5 other branches
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) |