Commit cd7a9890c397d89e8b2a795060128378403b48ba

Authored by Guilherme Andrade Del Cantoni
1 parent 741fcd33

Reformulação do serviço de monitoramento para corrigir erros de 'limbo' e 'represamento' de trâmites

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