Commit 1ac4ca34a2ff30bdca2f8a1c5afa2df25dd80a9d

Authored by Guilherme Andrade Del Cantoni
1 parent fb0705da

Correção de bug de loop infinito em recebimento de processo pelo mesmo sistema de envio

Showing 1 changed file with 192 additions and 216 deletions   Show diff stats
rn/PendenciasTramiteRN.php
1 1 <?php
  2 +
2 3 require_once dirname(__FILE__) . '/../../../SEI.php';
3 4  
4 5 error_reporting(E_ALL);
... ... @@ -6,247 +7,222 @@ error_reporting(E_ALL);
6 7 //TODO: Modificar nome da classe e método para outro mais apropriado
7 8 class PendenciasTramiteRN extends InfraRN {
8 9  
9   - private static $instance = null;
  10 + private static $instance = null;
  11 + private $strEnderecoServicoPendencias = null;
  12 + private $strLocalizacaoCertificadoDigital = null;
  13 + private $strSenhaCertificadoDigital = null;
10 14  
11   - private $strEnderecoServicoPendencias = null;
12   - private $strLocalizacaoCertificadoDigital = null;
13   - private $strSenhaCertificadoDigital = null;
  15 + protected function inicializarObjInfraIBanco(){
  16 + return BancoSEI::getInstance();
  17 + }
14 18  
15   - protected function inicializarObjInfraIBanco(){
16   - return BancoSEI::getInstance();
17   - }
  19 + public static function getInstance() {
  20 + if (self::$instance == null) {
  21 + self::$instance = new PendenciasTramiteRN(ConfiguracaoSEI::getInstance(), SessaoSEI::getInstance(), BancoSEI::getInstance(), LogSEI::getInstance());
  22 + }
  23 +
  24 + return self::$instance;
  25 + }
18 26  
19   - public static function getInstance() {
20   - if (self::$instance == null) {
21   - self::$instance = new PendenciasTramiteRN(ConfiguracaoSEI::getInstance(), SessaoSEI::getInstance(), BancoSEI::getInstance(), LogSEI::getInstance());
22   - }
23   - return self::$instance;
24   - }
  27 + public function __construct() {
25 28  
26   - public function __construct() {
27   -
28   - $objInfraParametro = new InfraParametro($this->inicializarObjInfraIBanco());
29   - $this->strLocalizacaoCertificadoDigital = $objInfraParametro->getValor('PEN_LOCALIZACAO_CERTIFICADO_DIGITAL');
30   -
31   - $this->strEnderecoServicoPendencias = $objInfraParametro->getValor('PEN_ENDERECO_WEBSERVICE_PENDENCIAS');
32   - //TODO: Urgente - Remover senha do certificado de autenticação dos serviços do PEN da tabela de parâmetros
33   - $this->strSenhaCertificadoDigital = $objInfraParametro->getValor('PEN_SENHA_CERTIFICADO_DIGITAL');
34   -
35   - if (InfraString::isBolVazia($this->strEnderecoServicoPendencias)) {
36   - throw new InfraException('Endereço do serviço de pendências de trâmite do Processo Eletrônico Nacional (PEN) não informado.');
37   - }
  29 + $objInfraParametro = new InfraParametro($this->inicializarObjInfraIBanco());
  30 + $this->strLocalizacaoCertificadoDigital = $objInfraParametro->getValor('PEN_LOCALIZACAO_CERTIFICADO_DIGITAL');
  31 + $this->strEnderecoServicoPendencias = $objInfraParametro->getValor('PEN_ENDERECO_WEBSERVICE_PENDENCIAS');
  32 + //TODO: Urgente - Remover senha do certificado de autenticação dos serviços do PEN da tabela de parâmetros
  33 + $this->strSenhaCertificadoDigital = $objInfraParametro->getValor('PEN_SENHA_CERTIFICADO_DIGITAL');
38 34  
39   - if (!@file_get_contents($this->strLocalizacaoCertificadoDigital)) {
40   - throw new InfraException("Certificado digital de autenticação do serviço de integração do Processo Eletrônico Nacional(PEN) não encontrado.");
41   - }
42   -
43   - if (InfraString::isBolVazia($this->strSenhaCertificadoDigital)) {
44   - throw new InfraException('Dados de autenticação do serviço de integração do Processo Eletrônico Nacional(PEN) não informados.');
45   - }
46   - }
47   -
48   - public function monitorarPendencias() {
49   - try{
50   - ini_set('max_execution_time','0');
51   - ini_set('memory_limit','-1');
52   -
53   - InfraDebug::getInstance()->setBolLigado(true);
54   - InfraDebug::getInstance()->setBolDebugInfra(false);
55   - InfraDebug::getInstance()->setBolEcho(false);
56   - InfraDebug::getInstance()->limpar();
57   -
58   - $objInfraParametro = new InfraParametro(BancoSEI::getInstance());
59   - SessaoSEI::getInstance(false)->simularLogin('SEI', null, null, $objInfraParametro->getValor('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO'));
60   -
61   - $numSeg = InfraUtil::verificarTempoProcessamento();
62   - InfraDebug::getInstance()->gravar('MONITORANDO OS TRÂMITES PENDENTES ENVIADOS PARA O ÓRGÃO (PEN)');
63   - echo "[".date("d/m/Y H:i:s")."] Iniciando serviço de monitoramento de pendências de trâmites de processos...\n";
64   -
65   - try{
66   -
67   - $numIdTramiteRecebido = 0;
68   - $numQuantidadeErroTrâmite = 0;
69   - $arrQuantidadeErrosTramite = array();
70   - // $arrTramites = array();
71   -
72   - //TODO: Tratar quantidade de erros o sistema consecutivos para um tramite de processo
73   - //Alcançado está quantidade, uma pendência posterior deverá ser obtida do barramento
74   - while (true) {
75   - $objPendenciaDTO = $this->obterPendenciasTramite($numIdTramiteRecebido);
76   -
77   - if(isset($objPendenciaDTO)) {
78   -
79   - if($numIdTramiteRecebido != $objPendenciaDTO->getNumIdentificacaoTramite()) {
80   -
81   - $numIdTramiteRecebido = $objPendenciaDTO->getNumIdentificacaoTramite();
82   -
83   - // if(!isset($arrTramites[$numIdTramiteRecebido])){
84   - // $arrTramites[$numIdTramiteRecebido] = true;
85   - $this->enviarPendenciaFilaProcessamento($objPendenciaDTO);
86   - //}
87   -
88   - }
89   - }
90   - sleep(5);
  35 + if (InfraString::isBolVazia($this->strEnderecoServicoPendencias)) {
  36 + throw new InfraException('Endereço do serviço de pendências de trâmite do Processo Eletrônico Nacional (PEN) não informado.');
91 37 }
92   - }
93   -
94   - //TODO: Urgente: Tratar erro específico de timeout e refazer a requisição
95   - catch(Exception $e) {
96   - $strAssunto = 'Erro monitorando pendências.';
97   - $strErro = InfraException::inspecionar($e);
98   - LogSEI::getInstance()->gravar($strAssunto."\n\n".$strErro);
99   - }
100   -
101   - $numSeg = InfraUtil::verificarTempoProcessamento($numSeg);
102   - InfraDebug::getInstance()->gravar('TEMPO TOTAL DE EXECUCAO: '.$numSeg.' s');
103   - InfraDebug::getInstance()->gravar('FIM');
104   -
105   - LogSEI::getInstance()->gravar(InfraDebug::getInstance()->getStrDebug());
106   -
107   - }
108   - catch(Exception $e) {
109   - InfraDebug::getInstance()->setBolLigado(false);
110   - InfraDebug::getInstance()->setBolDebugInfra(false);
111   - InfraDebug::getInstance()->setBolEcho(false);
112   - throw new InfraException('Erro processando pendências de integração com o PEN - Processo Eletrônico Nacional.',$e);
113   - }
114   - }
115   -
116   - private function configurarRequisicao()
117   - {
118   - $curl = curl_init($this->strEnderecoServicoPendencias);
119   - curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias);
120   - curl_setopt($curl, CURLOPT_HEADER, 0);
121   - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
122   - curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
123   - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
124   - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
125   - curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalizacaoCertificadoDigital);
126   - curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strSenhaCertificadoDigital);
127   - //curl_setopt($curl, CURLOPT_CONNECTTIMEOUT ,30);
128   - curl_setopt($curl, CURLOPT_TIMEOUT, 60); //timeout in seconds
129   - return $curl;
130   - }
131   -
132   - private function obterPendenciasTramite($parNumIdTramiteRecebido)
133   - {
134   - $resultado = null;
135   - $curl = $this->configurarRequisicao();
136   -
137 38  
138   - try{
139   -
140   - if(isset($parNumIdTramiteRecebido)) {
141   - curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias . "?idTramiteDaPendenciaRecebido=" . $parNumIdTramiteRecebido);
142   - }
143   - //error_log("obterPendenciasTramite: curl " . $this->strEnderecoServicoPendencias . " --key " . $this->strLocalizacaoCertificadoDigital . " --cert " . $this->strLocalizacaoCertificadoDigital . " --pass 1234 --insecure", 0);
  39 + if (!@file_get_contents($this->strLocalizacaoCertificadoDigital)) {
  40 + throw new InfraException("Certificado digital de autenticação do serviço de integração do Processo Eletrônico Nacional(PEN) não encontrado.");
  41 + }
144 42  
  43 + if (InfraString::isBolVazia($this->strSenhaCertificadoDigital)) {
  44 + throw new InfraException('Dados de autenticação do serviço de integração do Processo Eletrônico Nacional(PEN) não informados.');
  45 + }
  46 + }
145 47  
146   - //A seguinte requisição irá aguardar a notificação do PEN sobre uma nova pendência
147   - //ou até o lançamento da exceção de timeout definido pela infraestrutura da solução
148   - //Ambos os comportamentos são esperados para a requisição abaixo.
149   - $strResultadoJSON = curl_exec($curl);
150   -
151   - //error_log("obterPendenciasTramite: curl: " . print_r(curl_getinfo($curl), true), 0);
152   - //error_log("obterPendenciasTramite: strResultadoJSON: " . print_r($strResultadoJSON, true), 0);
153   -
154   - if(curl_errno($curl)) {
155   - if (curl_errno($curl) != 28)
156   - throw new InfraException("Erro na requisição do serviço de monitoramento de pendências. Curl: " . curl_errno($curl));
157   - }
158   -
159   - if(!InfraString::isBolVazia($strResultadoJSON)) {
160   - $strResultadoJSON = json_decode($strResultadoJSON);
161   -
162   - if(isset($strResultadoJSON) && $strResultadoJSON->encontrou) {
163   - $objPendenciaDTO = new PendenciaDTO();
164   - $objPendenciaDTO->setNumIdentificacaoTramite($strResultadoJSON->IDT);
165   - $objPendenciaDTO->setStrStatus($strResultadoJSON->status);
166   - $resultado = $objPendenciaDTO;
  48 + public function monitorarPendencias() {
  49 + try{
  50 + ini_set('max_execution_time','0');
  51 + ini_set('memory_limit','-1');
  52 +
  53 + InfraDebug::getInstance()->setBolLigado(true);
  54 + InfraDebug::getInstance()->setBolDebugInfra(true);
  55 + InfraDebug::getInstance()->setBolEcho(true);
  56 + InfraDebug::getInstance()->limpar();
  57 +
  58 + $objInfraParametro = new InfraParametro(BancoSEI::getInstance());
  59 + SessaoSEI::getInstance(false)->simularLogin('SEI', null, null, $objInfraParametro->getValor('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO'));
  60 +
  61 + $numSeg = InfraUtil::verificarTempoProcessamento();
  62 + InfraDebug::getInstance()->gravar('MONITORANDO OS TRÂMITES PENDENTES ENVIADOS PARA O ÓRGÃO (PEN)');
  63 + echo "[".date("d/m/Y H:i:s")."] Iniciando serviço de monitoramento de pendências de trâmites de processos...\n";
  64 +
  65 + try{
  66 + $numIdTramiteRecebido = 0;
  67 + $strStatusTramiteRecebido = '';
  68 + $numQuantidadeErroTrâmite = 0;
  69 + $arrQuantidadeErrosTramite = array();
  70 +
  71 + //TODO: Tratar quantidade de erros o sistema consecutivos para um tramite de processo
  72 + //Alcançado está quantidade, uma pendência posterior deverá ser obtida do barramento
  73 + while (true) {
  74 + $objPendenciaDTO = $this->obterPendenciasTramite($numIdTramiteRecebido);
  75 + if(isset($objPendenciaDTO)) {
  76 + if($numIdTramiteRecebido != $objPendenciaDTO->getNumIdentificacaoTramite() ||
  77 + $strStatusTramiteRecebido != $objPendenciaDTO->getStrStatus()) {
  78 + $numIdTramiteRecebido = $objPendenciaDTO->getNumIdentificacaoTramite();
  79 + $strStatusTramiteRecebido = $objPendenciaDTO->getStrStatus();
  80 + $this->enviarPendenciaFilaProcessamento($objPendenciaDTO);
  81 + }
  82 + }
  83 + sleep(5);
  84 + }
  85 + }
  86 + //TODO: Urgente: Tratar erro específico de timeout e refazer a requisição
  87 + catch(Exception $e) {
  88 + $strAssunto = 'Erro monitorando pendências.';
  89 + $strErro = InfraException::inspecionar($e);
  90 + LogSEI::getInstance()->gravar($strAssunto."\n\n".$strErro);
  91 + }
  92 +
  93 + $numSeg = InfraUtil::verificarTempoProcessamento($numSeg);
  94 + InfraDebug::getInstance()->gravar('TEMPO TOTAL DE EXECUCAO: '.$numSeg.' s');
  95 + InfraDebug::getInstance()->gravar('FIM');
  96 + LogSEI::getInstance()->gravar(InfraDebug::getInstance()->getStrDebug());
  97 +
  98 + }
  99 + catch(Exception $e) {
  100 + InfraDebug::getInstance()->setBolLigado(false);
  101 + InfraDebug::getInstance()->setBolDebugInfra(false);
  102 + InfraDebug::getInstance()->setBolEcho(false);
  103 + throw new InfraException('Erro processando pendências de integração com o PEN - Processo Eletrônico Nacional.',$e);
167 104 }
168   - }
169 105 }
170   - catch(Exception $e){
171   - curl_close($curl);
172   - throw $e;
173   - }
174   -
175   - curl_close($curl);
176   - return $resultado;
177   - }
178   -
179   - private function enviarPendenciaFilaProcessamento($objPendencia)
180   - {
181   - if(isset($objPendencia)) {
182   -
183   - $client = new GearmanClient();
184   - $client->addServer('localhost', 4730);
185   - //$client->setCreatedCallback("create_change");
186   - //$client->setDataCallback("data_change");
187   - //$client->setStatusCallback("status_change");
188   - //$client->setCompleteCallback("complete_change");
189   - //$client->setFailCallback("fail_change");
190   -
191   - $strWorkload = strval($objPendencia->getNumIdentificacaoTramite());
192   -
193   - switch ($objPendencia->getStrStatus()) {
194   -
195   - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO:
196   - $client->addTaskBackground('enviarComponenteDigital', $strWorkload, null);
197   - break;
198 106  
199   - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE:
200   - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO:
201   - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO:
202   -
203   - $objInfraParametro = new InfraParametro($this->inicializarObjInfraIBanco());
204   - $numTentativas = $objInfraParametro->getValor(PenTramiteProcessadoRN::PARAM_NUMERO_TENTATIVAS, false);
205   - $numCont = 0;
206   - // Executa sempre + 1 além do configurado no parâmetro para executar
207   - // a recusa
208   - while($numCont <= $numTentativas) {
209   -
210   - $client->addTaskBackground('receberProcedimento', $strWorkload, null);
211   - $numCont++;
  107 + private function configurarRequisicao()
  108 + {
  109 + $curl = curl_init($this->strEnderecoServicoPendencias);
  110 + curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias);
  111 + curl_setopt($curl, CURLOPT_HEADER, 0);
  112 + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  113 + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  114 + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  115 + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  116 + curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalizacaoCertificadoDigital);
  117 + curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strSenhaCertificadoDigital);
  118 + curl_setopt($curl, CURLOPT_TIMEOUT, 60); //timeout in seconds
  119 + return $curl;
  120 + }
  121 +
  122 + private function obterPendenciasTramite($parNumIdTramiteRecebido)
  123 + {
  124 + $resultado = null;
  125 + $curl = $this->configurarRequisicao();
  126 +
  127 + try{
  128 + if(isset($parNumIdTramiteRecebido)) {
  129 + curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias . "?idTramiteDaPendenciaRecebida=" . $parNumIdTramiteRecebido);
212 130 }
213   - break;
214 131  
  132 + //A seguinte requisição irá aguardar a notificação do PEN sobre uma nova pendência
  133 + //ou até o lançamento da exceção de timeout definido pela infraestrutura da solução
  134 + //Ambos os comportamentos são esperados para a requisição abaixo.
  135 + $strResultadoJSON = curl_exec($curl);
  136 +
  137 + if(curl_errno($curl)) {
  138 + if (curl_errno($curl) != 28)
  139 + throw new InfraException("Erro na requisição do serviço de monitoramento de pendências. Curl: " . curl_errno($curl));
  140 + }
215 141  
216   - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO:
217   -
218   - $objInfraParametro = new InfraParametro($this->inicializarObjInfraIBanco());
219   - $numTentativas = $objInfraParametro->getValor(PenTramiteProcessadoRN::PARAM_NUMERO_TENTATIVAS, false);
220   - $numCont = 0;
  142 + if(!InfraString::isBolVazia($strResultadoJSON)) {
  143 + $strResultadoJSON = json_decode($strResultadoJSON);
221 144  
222   - while($numCont < $numTentativas) {
223   -
224   - $client->addTaskBackground('receberReciboTramite', $strWorkload, null);
225   - $numCont++;
  145 + if(isset($strResultadoJSON) && $strResultadoJSON->encontrou) {
  146 + $objPendenciaDTO = new PendenciaDTO();
  147 + $objPendenciaDTO->setNumIdentificacaoTramite($strResultadoJSON->IDT);
  148 + $objPendenciaDTO->setStrStatus($strResultadoJSON->status);
  149 + $resultado = $objPendenciaDTO;
  150 + }
226 151 }
227   - break;
  152 + }
  153 + catch(Exception $e){
  154 + curl_close($curl);
  155 + throw $e;
  156 + }
228 157  
229   - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE:
230   - break;
  158 + curl_close($curl);
  159 + return $resultado;
  160 + }
231 161  
232   - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO:
  162 + private function enviarPendenciaFilaProcessamento($objPendencia)
  163 + {
  164 + if(isset($objPendencia)) {
  165 +
  166 + $client = new GearmanClient();
  167 + $client->addServer('localhost', 4730);
  168 + //$client->setCreatedCallback("create_change");
  169 + //$client->setDataCallback("data_change");
  170 + //$client->setStatusCallback("status_change");
  171 + //$client->setCompleteCallback("complete_change");
  172 + //$client->setFailCallback("fail_change");
  173 +
  174 + $strWorkload = strval($objPendencia->getNumIdentificacaoTramite());
  175 +
  176 + switch ($objPendencia->getStrStatus()) {
  177 +
  178 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO:
  179 + $client->addTaskBackground('enviarComponenteDigital', $strWorkload, null);
  180 + break;
  181 +
  182 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE:
  183 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO:
  184 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO:
  185 + $objInfraParametro = new InfraParametro($this->inicializarObjInfraIBanco());
  186 + $numTentativas = $objInfraParametro->getValor(PenTramiteProcessadoRN::PARAM_NUMERO_TENTATIVAS, false);
  187 + $numCont = 0;
  188 + // Executa sempre + 1 além do configurado no parâmetro para executar a recusa
  189 + while($numCont <= $numTentativas) {
  190 + $client->addTaskBackground('receberProcedimento', $strWorkload, null);
  191 + $numCont++;
  192 + }
  193 + break;
  194 +
  195 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO:
  196 + $objInfraParametro = new InfraParametro($this->inicializarObjInfraIBanco());
  197 + $numTentativas = $objInfraParametro->getValor(PenTramiteProcessadoRN::PARAM_NUMERO_TENTATIVAS, false);
  198 + $numCont = 0;
  199 +
  200 + while($numCont < $numTentativas) {
  201 + $client->addTaskBackground('receberReciboTramite', $strWorkload, null);
  202 + $numCont++;
  203 + }
  204 + break;
  205 +
  206 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE:
233 207 break;
234 208  
235   - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO:
236   - $client->addTaskBackground("receberTramitesRecusados", $strWorkload, null);;
  209 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO:
237 210 break;
238 211  
239   - default:
  212 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO:
  213 + $client->addTaskBackground("receberTramitesRecusados", $strWorkload, null);;
  214 + break;
240 215  
241   - //TODO: Alterar lógica para não deixar de processar demais pendências retornadas pelo PEN
242   - throw new Exception('Situação do trâmite não pode ser identificada.');
243   - break;
244   - }
  216 + default:
  217 + //TODO: Alterar lógica para não deixar de processar demais pendências retornadas pelo PEN
  218 + throw new Exception('Situação do trâmite não pode ser identificada.');
  219 + break;
  220 + }
245 221  
246   - $client->runTasks();
247   - }
248   - }
  222 + $client->runTasks();
  223 + }
  224 + }
249 225 }
250 226  
251 227 SessaoSEI::getInstance(false);
252   -PendenciasTramiteRN::getInstance()->monitorarPendencias();
253 228 \ No newline at end of file
  229 +PendenciasTramiteRN::getInstance()->monitorarPendencias();
... ...