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