Commit cd7a9890c397d89e8b2a795060128378403b48ba
1 parent
741fcd33
Exists in
master
and in
19 other branches
Reformulação do serviço de monitoramento para corrigir erros de 'limbo' e 'represamento' de trâmites
Showing
2 changed files
with
40 additions
and
57 deletions
Show diff stats
rn/PendenciasTramiteRN.php
| ... | ... | @@ -4,9 +4,10 @@ require_once dirname(__FILE__) . '/../../../SEI.php'; |
| 4 | 4 | |
| 5 | 5 | error_reporting(E_ALL); |
| 6 | 6 | |
| 7 | -//TODO: Modificar nome da classe e mtodo para outro mais apropriado | |
| 8 | 7 | class PendenciasTramiteRN extends InfraRN { |
| 9 | 8 | |
| 9 | + const TIMEOUT_SERVICO_PENDENCIAS = 900; | |
| 10 | + | |
| 10 | 11 | private static $instance = null; |
| 11 | 12 | private $strEnderecoServicoPendencias = null; |
| 12 | 13 | private $strLocalizacaoCertificadoDigital = null; |
| ... | ... | @@ -45,14 +46,16 @@ class PendenciasTramiteRN extends InfraRN { |
| 45 | 46 | } |
| 46 | 47 | } |
| 47 | 48 | |
| 49 | + | |
| 50 | + | |
| 48 | 51 | public function monitorarPendencias() { |
| 49 | 52 | // try{ |
| 50 | 53 | ini_set('max_execution_time','0'); |
| 51 | 54 | ini_set('memory_limit','-1'); |
| 52 | 55 | |
| 53 | - InfraDebug::getInstance()->setBolLigado(false); | |
| 56 | + InfraDebug::getInstance()->setBolLigado(true); | |
| 54 | 57 | InfraDebug::getInstance()->setBolDebugInfra(false); |
| 55 | - InfraDebug::getInstance()->setBolEcho(false); | |
| 58 | + InfraDebug::getInstance()->setBolEcho(true); | |
| 56 | 59 | InfraDebug::getInstance()->limpar(); |
| 57 | 60 | |
| 58 | 61 | PENIntegracao::validarCompatibilidadeModulo(); |
| ... | ... | @@ -60,9 +63,9 @@ class PendenciasTramiteRN extends InfraRN { |
| 60 | 63 | $objPenParametroRN = new PenParametroRN(); |
| 61 | 64 | SessaoSEI::getInstance(false)->simularLogin('SEI', null, null, $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO')); |
| 62 | 65 | |
| 63 | - $numSeg = InfraUtil::verificarTempoProcessamento(); | |
| 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"; | |
| 66 | + $mensagemInicioMonitoramento = 'Iniciando serviço de monitoramento de pendências de trâmites de processos'; | |
| 67 | + LogSEI::getInstance()->gravar($mensagemInicioMonitoramento, LogSEI::$INFORMACAO); | |
| 68 | + $this->gravarLogDebug($mensagemInicioMonitoramento); | |
| 66 | 69 | |
| 67 | 70 | // try{ |
| 68 | 71 | $numIdTramiteRecebido = 0; |
| ... | ... | @@ -70,23 +73,15 @@ class PendenciasTramiteRN extends InfraRN { |
| 70 | 73 | $numQuantidadeErroTramite = 0; |
| 71 | 74 | $arrQuantidadeErrosTramite = array(); |
| 72 | 75 | |
| 73 | - | |
| 74 | - | |
| 75 | - //TODO: Tratar quantidade de erros o sistema consecutivos para um tramite de processo | |
| 76 | - //Alcanado est quantidade, uma pendncia posterior dever ser obtida do barramento | |
| 77 | - echo "\nIniciando monitoramento de pendências"; | |
| 78 | 76 | while (true) { |
| 79 | - echo "\n Obtendo lista de pendências"; | |
| 77 | + $this->gravarLogDebug('Recuperando lista de pendências do PEN', 1); | |
| 80 | 78 | $arrObjPendenciasDTO = $this->obterPendenciasTramite(); |
| 81 | 79 | 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()); | |
| 80 | + $this->gravarLogDebug(sprintf(">>> Enviando pendência %d (status %s) para fila de processamento", $objPendenciaDTO->getNumIdentificacaoTramite(), $objPendenciaDTO->getStrStatus()), 3); | |
| 86 | 81 | $this->enviarPendenciaFilaProcessamento($objPendenciaDTO); |
| 87 | 82 | } |
| 88 | 83 | |
| 89 | - echo "\nReiniciando monitoramento de pendências"; | |
| 84 | + $this->gravarLogDebug("Reiniciando monitoramento de pendências", 1); | |
| 90 | 85 | sleep(5); |
| 91 | 86 | } |
| 92 | 87 | // } |
| ... | ... | @@ -96,12 +91,6 @@ class PendenciasTramiteRN extends InfraRN { |
| 96 | 91 | // $strErro = InfraException::inspecionar($e); |
| 97 | 92 | // LogSEI::getInstance()->gravar($strAssunto."\n\n".$strErro); |
| 98 | 93 | // } |
| 99 | - | |
| 100 | - $numSeg = InfraUtil::verificarTempoProcessamento($numSeg); | |
| 101 | - InfraDebug::getInstance()->gravar('TEMPO TOTAL DE EXECUCAO: '.$numSeg.' s'); | |
| 102 | - InfraDebug::getInstance()->gravar('FIM'); | |
| 103 | - LogSEI::getInstance()->gravar(InfraDebug::getInstance()->getStrDebug()); | |
| 104 | - | |
| 105 | 94 | // } |
| 106 | 95 | // catch(Exception $e) { |
| 107 | 96 | // InfraDebug::getInstance()->setBolLigado(false); |
| ... | ... | @@ -122,7 +111,7 @@ class PendenciasTramiteRN extends InfraRN { |
| 122 | 111 | curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); |
| 123 | 112 | curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalizacaoCertificadoDigital); |
| 124 | 113 | curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strSenhaCertificadoDigital); |
| 125 | - curl_setopt($curl, CURLOPT_TIMEOUT, 6000); | |
| 114 | + curl_setopt($curl, CURLOPT_TIMEOUT, self::TIMEOUT_SERVICO_PENDENCIAS); | |
| 126 | 115 | return $curl; |
| 127 | 116 | } |
| 128 | 117 | |
| ... | ... | @@ -139,7 +128,8 @@ class PendenciasTramiteRN extends InfraRN { |
| 139 | 128 | $objProcessoEletronicoRN = new ProcessoEletronicoRN(); |
| 140 | 129 | $arrObjPendenciasDTO = $objProcessoEletronicoRN->listarPendencias(false) or array(); |
| 141 | 130 | |
| 142 | - echo sprintf("\n Recuperando todas as pendências do barramento: " . count($arrObjPendenciasDTO)); | |
| 131 | + $this->gravarLogDebug("Recuperado todas pendências de trâmite do PEN: " . count($arrObjPendenciasDTO), 2); | |
| 132 | + | |
| 143 | 133 | foreach ($arrObjPendenciasDTO as $objPendenciaDTO) { |
| 144 | 134 | //Captura todas as pendências e status retornadas para impedir duplicidade |
| 145 | 135 | $arrPendenciasRetornadas[] = sprintf("%d-%s", $objPendenciaDTO->getNumIdentificacaoTramite(), $objPendenciaDTO->getStrStatus()); |
| ... | ... | @@ -151,17 +141,18 @@ class PendenciasTramiteRN extends InfraRN { |
| 151 | 141 | $numUltimoIdTramiteRecebido = 0; |
| 152 | 142 | |
| 153 | 143 | $arrObjPendenciasDTONovas = array(); |
| 154 | - echo "\n Iniciando monitoramento no serviço long pulling"; | |
| 144 | + $this->gravarLogDebug("Iniciando monitoramento no serviço de pendências (long polling)", 2); | |
| 145 | + | |
| 155 | 146 | do { |
| 156 | 147 | $curl = $this->configurarRequisicao(); |
| 157 | 148 | try{ |
| 158 | - | |
| 149 | + $arrObjPendenciasDTONovas = array_unique($arrObjPendenciasDTONovas); | |
| 159 | 150 | curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias . "?idTramiteDaPendenciaRecebida=" . $numUltimoIdTramiteRecebido); |
| 160 | 151 | |
| 161 | 152 | //A seguinte requisio ir aguardar a notificao do PEN sobre uma nova pendncia |
| 162 | 153 | //ou at o lanamento da exceo de timeout definido pela infraestrutura da soluo |
| 163 | 154 | //Ambos os comportamentos so esperados para a requisio abaixo. |
| 164 | - echo sprintf("\n Executando requisição de pendência com IDT %d", $numUltimoIdTramiteRecebido); | |
| 155 | + $this->gravarLogDebug(sprintf("Executando requisição de pendência com IDT %d como offset", $numUltimoIdTramiteRecebido), 2); | |
| 165 | 156 | $strResultadoJSON = curl_exec($curl); |
| 166 | 157 | |
| 167 | 158 | if(curl_errno($curl)) { |
| ... | ... | @@ -169,15 +160,16 @@ class PendenciasTramiteRN extends InfraRN { |
| 169 | 160 | throw new InfraException("Erro na requisição do serviço de monitoramento de pendências. Curl: " . curl_errno($curl)); |
| 170 | 161 | |
| 171 | 162 | $bolEncontrouPendencia = false; |
| 172 | - echo "\n*** TIMEOUT FORÇADO ***"; | |
| 163 | + $this->gravarLogDebug(sprintf("Timeout de monitoramento de %d segundos do serviço de pendências alcançado", self::TIMEOUT_SERVICO_PENDENCIAS), 2); | |
| 173 | 164 | } |
| 174 | 165 | |
| 175 | 166 | if(!InfraString::isBolVazia($strResultadoJSON)) { |
| 176 | 167 | $strResultadoJSON = json_decode($strResultadoJSON); |
| 177 | 168 | |
| 178 | - if(isset($strResultadoJSON) && isset($strResultadoJSON->encontrou) && strtolower($strResultadoJSON->encontrou) == true) { | |
| 169 | + if(isset($strResultadoJSON->encontrou) && $strResultadoJSON->encontrou) { | |
| 179 | 170 | $bolEncontrouPendencia = true; |
| 180 | 171 | $numUltimoIdTramiteRecebido = $strResultadoJSON->IDT; |
| 172 | + $strUltimoStatusRecebido = $strResultadoJSON->status; | |
| 181 | 173 | $strChavePendencia = sprintf("%d-%s", $strResultadoJSON->IDT, $strResultadoJSON->status); |
| 182 | 174 | $objPendenciaDTO = new PendenciaDTO(); |
| 183 | 175 | $objPendenciaDTO->setNumIdentificacaoTramite($strResultadoJSON->IDT); |
| ... | ... | @@ -192,10 +184,13 @@ class PendenciasTramiteRN extends InfraRN { |
| 192 | 184 | } elseif(in_array($strChavePendencia, $arrObjPendenciasDTONovas)) { |
| 193 | 185 | // Sleep adicionado para minimizar problema do serviço de pendência que retorna o mesmo código e status |
| 194 | 186 | // 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); | |
| 187 | + $mensagemErro = sprintf("Pendência de trâmite (IDT: %d / status: %s) enviado em duplicidade pelo serviço de monitoramento de pendências do PEN", | |
| 188 | + $numUltimoIdTramiteRecebido, $strUltimoStatusRecebido); | |
| 189 | + $this->gravarLogDebug($mensagemErro, 2); | |
| 190 | + throw new InfraException($mensagemErro); | |
| 197 | 191 | } else { |
| 198 | - echo sprintf("\n IDT %d desconsiderado por já ter sido retornado na consulta inicial", $numUltimoIdTramiteRecebido); | |
| 192 | + $arrObjPendenciasDTONovas[] = $strChavePendencia; | |
| 193 | + $this->gravarLogDebug(sprintf("IDT %d desconsiderado por já ter sido retornado na consulta inicial", $numUltimoIdTramiteRecebido), 2); | |
| 199 | 194 | } |
| 200 | 195 | } |
| 201 | 196 | } |
| ... | ... | @@ -214,12 +209,7 @@ class PendenciasTramiteRN extends InfraRN { |
| 214 | 209 | if(isset($objPendencia)) { |
| 215 | 210 | |
| 216 | 211 | $client = new GearmanClient(); |
| 217 | - $client->addServer('localhost', 4730); | |
| 218 | - //$client->setCreatedCallback("create_change"); | |
| 219 | - //$client->setDataCallback("data_change"); | |
| 220 | - //$client->setStatusCallback("status_change"); | |
| 221 | - //$client->setCompleteCallback("complete_change"); | |
| 222 | - //$client->setFailCallback("fail_change"); | |
| 212 | + $client->addServer(); | |
| 223 | 213 | |
| 224 | 214 | $strWorkload = strval($objPendencia->getNumIdentificacaoTramite()); |
| 225 | 215 | |
| ... | ... | @@ -232,25 +222,13 @@ class PendenciasTramiteRN extends InfraRN { |
| 232 | 222 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE: |
| 233 | 223 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO: |
| 234 | 224 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO: |
| 235 | - $objPenParametroRN = new PenParametroRN(); | |
| 236 | - $numTentativas = $objPenParametroRN->getParametro(PenTramiteProcessadoRN::PARAM_NUMERO_TENTATIVAS, false); | |
| 237 | - $numCont = 0; | |
| 238 | - // Executa sempre + 1 alm do configurado no parâmetro para executar a recusa | |
| 239 | - while($numCont <= $numTentativas) { | |
| 240 | - $client->addTaskBackground('receberProcedimento', $strWorkload, null); | |
| 241 | - $numCont++; | |
| 242 | - } | |
| 225 | + $client->addTaskBackground('receberProcedimento', $strWorkload, null); | |
| 226 | + $numCont++; | |
| 243 | 227 | break; |
| 244 | 228 | |
| 245 | 229 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO: |
| 246 | - $objPenParametroRN = new PenParametroRN(); | |
| 247 | - $numTentativas = $objPenParametroRN->getParametro(PenTramiteProcessadoRN::PARAM_NUMERO_TENTATIVAS, false); | |
| 248 | - $numCont = 0; | |
| 249 | - | |
| 250 | - while($numCont < $numTentativas) { | |
| 251 | - $client->addTaskBackground('receberReciboTramite', $strWorkload, null); | |
| 252 | - $numCont++; | |
| 253 | - } | |
| 230 | + $client->addTaskBackground('receberReciboTramite', $strWorkload, null); | |
| 231 | + $numCont++; | |
| 254 | 232 | break; |
| 255 | 233 | |
| 256 | 234 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE: |
| ... | ... | @@ -264,7 +242,6 @@ class PendenciasTramiteRN extends InfraRN { |
| 264 | 242 | break; |
| 265 | 243 | |
| 266 | 244 | default: |
| 267 | - //TODO: Alterar lgica para no deixar de processar demais pendncias retornadas pelo PEN | |
| 268 | 245 | throw new Exception('Situação do trâmite não pode ser identificada.'); |
| 269 | 246 | break; |
| 270 | 247 | } |
| ... | ... | @@ -272,6 +249,12 @@ class PendenciasTramiteRN extends InfraRN { |
| 272 | 249 | $client->runTasks(); |
| 273 | 250 | } |
| 274 | 251 | } |
| 252 | + | |
| 253 | + private function gravarLogDebug($mensagem, $identacao=0) | |
| 254 | + { | |
| 255 | + $mensagem = sprintf("[%s] %s %s", date("d/m/Y H:i:s"), str_repeat("\t", $identacao), $mensagem); | |
| 256 | + InfraDebug::getInstance()->gravar($mensagem); | |
| 257 | + } | |
| 275 | 258 | } |
| 276 | 259 | |
| 277 | 260 | SessaoSEI::getInstance(false); | ... | ... |
rn/ProcessarPendenciasRN.php
| ... | ... | @@ -24,7 +24,7 @@ class ProcessarPendenciasRN extends InfraAgendamentoTarefa |
| 24 | 24 | { |
| 25 | 25 | //Configuração do worker do Gearman para realizar o processamento de tarefas |
| 26 | 26 | $this->objGearmanWorker = new GearmanWorker(); |
| 27 | - $this->objGearmanWorker->addServer('localhost', 4730); | |
| 27 | + $this->objGearmanWorker->addServer(); | |
| 28 | 28 | $this->configurarCallbacks(); |
| 29 | 29 | } |
| 30 | 30 | ... | ... |