Commit cd7a9890c397d89e8b2a795060128378403b48ba
1 parent
741fcd33
Exists in
master
and in
5 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 |