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,9 +4,10 @@ require_once dirname(__FILE__) . '/../../../SEI.php'; | ||
| 4 | 4 | ||
| 5 | error_reporting(E_ALL); | 5 | error_reporting(E_ALL); |
| 6 | 6 | ||
| 7 | -//TODO: Modificar nome da classe e mtodo para outro mais apropriado | ||
| 8 | class PendenciasTramiteRN extends InfraRN { | 7 | class PendenciasTramiteRN extends InfraRN { |
| 9 | 8 | ||
| 9 | + const TIMEOUT_SERVICO_PENDENCIAS = 900; | ||
| 10 | + | ||
| 10 | private static $instance = null; | 11 | private static $instance = null; |
| 11 | private $strEnderecoServicoPendencias = null; | 12 | private $strEnderecoServicoPendencias = null; |
| 12 | private $strLocalizacaoCertificadoDigital = null; | 13 | private $strLocalizacaoCertificadoDigital = null; |
| @@ -45,14 +46,16 @@ class PendenciasTramiteRN extends InfraRN { | @@ -45,14 +46,16 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 45 | } | 46 | } |
| 46 | } | 47 | } |
| 47 | 48 | ||
| 49 | + | ||
| 50 | + | ||
| 48 | public function monitorarPendencias() { | 51 | public function monitorarPendencias() { |
| 49 | // try{ | 52 | // try{ |
| 50 | ini_set('max_execution_time','0'); | 53 | ini_set('max_execution_time','0'); |
| 51 | ini_set('memory_limit','-1'); | 54 | ini_set('memory_limit','-1'); |
| 52 | 55 | ||
| 53 | - InfraDebug::getInstance()->setBolLigado(false); | 56 | + InfraDebug::getInstance()->setBolLigado(true); |
| 54 | InfraDebug::getInstance()->setBolDebugInfra(false); | 57 | InfraDebug::getInstance()->setBolDebugInfra(false); |
| 55 | - InfraDebug::getInstance()->setBolEcho(false); | 58 | + InfraDebug::getInstance()->setBolEcho(true); |
| 56 | InfraDebug::getInstance()->limpar(); | 59 | InfraDebug::getInstance()->limpar(); |
| 57 | 60 | ||
| 58 | PENIntegracao::validarCompatibilidadeModulo(); | 61 | PENIntegracao::validarCompatibilidadeModulo(); |
| @@ -60,9 +63,9 @@ class PendenciasTramiteRN extends InfraRN { | @@ -60,9 +63,9 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 60 | $objPenParametroRN = new PenParametroRN(); | 63 | $objPenParametroRN = new PenParametroRN(); |
| 61 | SessaoSEI::getInstance(false)->simularLogin('SEI', null, null, $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO')); | 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 | // try{ | 70 | // try{ |
| 68 | $numIdTramiteRecebido = 0; | 71 | $numIdTramiteRecebido = 0; |
| @@ -70,23 +73,15 @@ class PendenciasTramiteRN extends InfraRN { | @@ -70,23 +73,15 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 70 | $numQuantidadeErroTramite = 0; | 73 | $numQuantidadeErroTramite = 0; |
| 71 | $arrQuantidadeErrosTramite = array(); | 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 | while (true) { | 76 | while (true) { |
| 79 | - echo "\n Obtendo lista de pendências"; | 77 | + $this->gravarLogDebug('Recuperando lista de pendências do PEN', 1); |
| 80 | $arrObjPendenciasDTO = $this->obterPendenciasTramite(); | 78 | $arrObjPendenciasDTO = $this->obterPendenciasTramite(); |
| 81 | foreach ($arrObjPendenciasDTO as $objPendenciaDTO) { | 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 | $this->enviarPendenciaFilaProcessamento($objPendenciaDTO); | 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 | sleep(5); | 85 | sleep(5); |
| 91 | } | 86 | } |
| 92 | // } | 87 | // } |
| @@ -96,12 +91,6 @@ class PendenciasTramiteRN extends InfraRN { | @@ -96,12 +91,6 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 96 | // $strErro = InfraException::inspecionar($e); | 91 | // $strErro = InfraException::inspecionar($e); |
| 97 | // LogSEI::getInstance()->gravar($strAssunto."\n\n".$strErro); | 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 | // catch(Exception $e) { | 95 | // catch(Exception $e) { |
| 107 | // InfraDebug::getInstance()->setBolLigado(false); | 96 | // InfraDebug::getInstance()->setBolLigado(false); |
| @@ -122,7 +111,7 @@ class PendenciasTramiteRN extends InfraRN { | @@ -122,7 +111,7 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 122 | curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); | 111 | curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); |
| 123 | curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalizacaoCertificadoDigital); | 112 | curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalizacaoCertificadoDigital); |
| 124 | curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strSenhaCertificadoDigital); | 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 | return $curl; | 115 | return $curl; |
| 127 | } | 116 | } |
| 128 | 117 | ||
| @@ -139,7 +128,8 @@ class PendenciasTramiteRN extends InfraRN { | @@ -139,7 +128,8 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 139 | $objProcessoEletronicoRN = new ProcessoEletronicoRN(); | 128 | $objProcessoEletronicoRN = new ProcessoEletronicoRN(); |
| 140 | $arrObjPendenciasDTO = $objProcessoEletronicoRN->listarPendencias(false) or array(); | 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 | foreach ($arrObjPendenciasDTO as $objPendenciaDTO) { | 133 | foreach ($arrObjPendenciasDTO as $objPendenciaDTO) { |
| 144 | //Captura todas as pendências e status retornadas para impedir duplicidade | 134 | //Captura todas as pendências e status retornadas para impedir duplicidade |
| 145 | $arrPendenciasRetornadas[] = sprintf("%d-%s", $objPendenciaDTO->getNumIdentificacaoTramite(), $objPendenciaDTO->getStrStatus()); | 135 | $arrPendenciasRetornadas[] = sprintf("%d-%s", $objPendenciaDTO->getNumIdentificacaoTramite(), $objPendenciaDTO->getStrStatus()); |
| @@ -151,17 +141,18 @@ class PendenciasTramiteRN extends InfraRN { | @@ -151,17 +141,18 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 151 | $numUltimoIdTramiteRecebido = 0; | 141 | $numUltimoIdTramiteRecebido = 0; |
| 152 | 142 | ||
| 153 | $arrObjPendenciasDTONovas = array(); | 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 | do { | 146 | do { |
| 156 | $curl = $this->configurarRequisicao(); | 147 | $curl = $this->configurarRequisicao(); |
| 157 | try{ | 148 | try{ |
| 158 | - | 149 | + $arrObjPendenciasDTONovas = array_unique($arrObjPendenciasDTONovas); |
| 159 | curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias . "?idTramiteDaPendenciaRecebida=" . $numUltimoIdTramiteRecebido); | 150 | curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias . "?idTramiteDaPendenciaRecebida=" . $numUltimoIdTramiteRecebido); |
| 160 | 151 | ||
| 161 | //A seguinte requisio ir aguardar a notificao do PEN sobre uma nova pendncia | 152 | //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 | 153 | //ou at o lanamento da exceo de timeout definido pela infraestrutura da soluo |
| 163 | //Ambos os comportamentos so esperados para a requisio abaixo. | 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 | $strResultadoJSON = curl_exec($curl); | 156 | $strResultadoJSON = curl_exec($curl); |
| 166 | 157 | ||
| 167 | if(curl_errno($curl)) { | 158 | if(curl_errno($curl)) { |
| @@ -169,15 +160,16 @@ class PendenciasTramiteRN extends InfraRN { | @@ -169,15 +160,16 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 169 | throw new InfraException("Erro na requisição do serviço de monitoramento de pendências. Curl: " . curl_errno($curl)); | 160 | throw new InfraException("Erro na requisição do serviço de monitoramento de pendências. Curl: " . curl_errno($curl)); |
| 170 | 161 | ||
| 171 | $bolEncontrouPendencia = false; | 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 | if(!InfraString::isBolVazia($strResultadoJSON)) { | 166 | if(!InfraString::isBolVazia($strResultadoJSON)) { |
| 176 | $strResultadoJSON = json_decode($strResultadoJSON); | 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 | $bolEncontrouPendencia = true; | 170 | $bolEncontrouPendencia = true; |
| 180 | $numUltimoIdTramiteRecebido = $strResultadoJSON->IDT; | 171 | $numUltimoIdTramiteRecebido = $strResultadoJSON->IDT; |
| 172 | + $strUltimoStatusRecebido = $strResultadoJSON->status; | ||
| 181 | $strChavePendencia = sprintf("%d-%s", $strResultadoJSON->IDT, $strResultadoJSON->status); | 173 | $strChavePendencia = sprintf("%d-%s", $strResultadoJSON->IDT, $strResultadoJSON->status); |
| 182 | $objPendenciaDTO = new PendenciaDTO(); | 174 | $objPendenciaDTO = new PendenciaDTO(); |
| 183 | $objPendenciaDTO->setNumIdentificacaoTramite($strResultadoJSON->IDT); | 175 | $objPendenciaDTO->setNumIdentificacaoTramite($strResultadoJSON->IDT); |
| @@ -192,10 +184,13 @@ class PendenciasTramiteRN extends InfraRN { | @@ -192,10 +184,13 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 192 | } elseif(in_array($strChavePendencia, $arrObjPendenciasDTONovas)) { | 184 | } 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 | 185 | // 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 | 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 | } else { | 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,12 +209,7 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 214 | if(isset($objPendencia)) { | 209 | if(isset($objPendencia)) { |
| 215 | 210 | ||
| 216 | $client = new GearmanClient(); | 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 | $strWorkload = strval($objPendencia->getNumIdentificacaoTramite()); | 214 | $strWorkload = strval($objPendencia->getNumIdentificacaoTramite()); |
| 225 | 215 | ||
| @@ -232,25 +222,13 @@ class PendenciasTramiteRN extends InfraRN { | @@ -232,25 +222,13 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 232 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE: | 222 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE: |
| 233 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO: | 223 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO: |
| 234 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO: | 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 | break; | 227 | break; |
| 244 | 228 | ||
| 245 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO: | 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 | break; | 232 | break; |
| 255 | 233 | ||
| 256 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE: | 234 | case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE: |
| @@ -264,7 +242,6 @@ class PendenciasTramiteRN extends InfraRN { | @@ -264,7 +242,6 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 264 | break; | 242 | break; |
| 265 | 243 | ||
| 266 | default: | 244 | default: |
| 267 | - //TODO: Alterar lgica para no deixar de processar demais pendncias retornadas pelo PEN | ||
| 268 | throw new Exception('Situação do trâmite não pode ser identificada.'); | 245 | throw new Exception('Situação do trâmite não pode ser identificada.'); |
| 269 | break; | 246 | break; |
| 270 | } | 247 | } |
| @@ -272,6 +249,12 @@ class PendenciasTramiteRN extends InfraRN { | @@ -272,6 +249,12 @@ class PendenciasTramiteRN extends InfraRN { | ||
| 272 | $client->runTasks(); | 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 | SessaoSEI::getInstance(false); | 260 | SessaoSEI::getInstance(false); |
rn/ProcessarPendenciasRN.php
| @@ -24,7 +24,7 @@ class ProcessarPendenciasRN extends InfraAgendamentoTarefa | @@ -24,7 +24,7 @@ class ProcessarPendenciasRN extends InfraAgendamentoTarefa | ||
| 24 | { | 24 | { |
| 25 | //Configuração do worker do Gearman para realizar o processamento de tarefas | 25 | //Configuração do worker do Gearman para realizar o processamento de tarefas |
| 26 | $this->objGearmanWorker = new GearmanWorker(); | 26 | $this->objGearmanWorker = new GearmanWorker(); |
| 27 | - $this->objGearmanWorker->addServer('localhost', 4730); | 27 | + $this->objGearmanWorker->addServer(); |
| 28 | $this->configurarCallbacks(); | 28 | $this->configurarCallbacks(); |
| 29 | } | 29 | } |
| 30 | 30 |