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 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  
... ...