コード例 #1
0
        /// <summary>
        /// Called by the <see cref="T:Quartz.IScheduler" /> when a <see cref="T:Quartz.ITrigger" />
        /// fires that is associated with the <see cref="T:Quartz.IJob" />.
        /// </summary>
        /// <param name="context">The execution context.</param>
        /// <remarks>
        /// The implementation may wish to set a  result object on the
        /// JobExecutionContext before this method exits.  The result itself
        /// is meaningless to Quartz, but may be informative to
        /// <see cref="T:Quartz.IJobListener" />s or
        /// <see cref="T:Quartz.ITriggerListener" />s that are watching the job's
        /// execution.
        /// </remarks>
        public async void Execute(IJobExecutionContext context)
        {
            //logging
            var jobKey = context.JobDetail.Key;

            Log.InfoFormat("BEGIN {0} executing at {1}", jobKey, DateTime.Now.ToString("r"));

            using (var conn = new OracleConnection(CarUtils.GetBancoInstitucional()))
            {
                conn.Open();
                string tid = string.Empty;

                var pathArquivoTemporario = new ArquivoManager().BuscarDiretorioArquivoTemporario(conn);

                if (!pathArquivoTemporario.EndsWith("\\"))
                {
                    pathArquivoTemporario += "\\";
                }
                pathArquivoTemporario += "SICAR\\";

                //Veja se
                var nextItem = LocalDB.PegarProximoItemFila(conn, "enviar-car");

                while (nextItem != null)
                {
                    //Update item as Started
                    //LocalDB.MarcarItemFilaIniciado(conn, nextItem.Id);

                    var item = LocalDB.PegarItemFilaPorId(conn, nextItem.Requisitante);

                    var requisicao = JsonConvert.DeserializeObject <RequisicaoJobCar>(item.Requisicao);
                    tid = Blocos.Data.GerenciadorTransacao.ObterIDAtual();

                    string resultado = "";
                    try
                    {
                        //Atualizar controle de envio do SICAR
                        ControleCarDB.AtualizarControleSICAR(conn, null, requisicao, ControleCarDB.SITUACAO_ENVIO_ENVIANDO, tid);
                        var controleCar = ControleCarDB.ObterItemControleCar(conn, requisicao);

                        var dataCadastroEstadual = ControleCarDB.ObterDataSolicitacao(conn, requisicao.solicitacao_car, requisicao.origem);

                        resultado = await EnviarArquivoCAR(pathArquivoTemporario + nextItem.Requisicao, dataCadastroEstadual);

                        var resultadoEnvio = JsonConvert.DeserializeObject <MensagemRetorno>(resultado);

                        if (resultadoEnvio.codigoResposta == MensagemRetorno.CodigoRespostaErro)
                        {
                            resultado = await EnviarArquivoCAR(pathArquivoTemporario + nextItem.Requisicao, dataCadastroEstadual);

                            resultadoEnvio = JsonConvert.DeserializeObject <MensagemRetorno>(resultado);
                        }

                        //Salvar no diretorio de arquivos do SIMLAM Institucional
                        string arquivoFinal;
                        using (var stream = File.Open(pathArquivoTemporario + nextItem.Requisicao, FileMode.Open, FileAccess.Read, FileShare.Read))
                        {
                            var arquivoManager = new ArquivoManager();
                            arquivoFinal = arquivoManager.Salvar(nextItem.Requisicao, stream, conn);
                        }


                        if (resultadoEnvio.codigoResposta == MensagemRetorno.CodigoRespostaErro ||
                            (resultadoEnvio.codigoResposta == MensagemRetorno.CodigoRespostaInconformidade &&
                             resultadoEnvio.mensagensResposta.Any(r => r.Equals("Foi encontrada sobreposição de 100,00% com outro imóvel já inscrito no CAR que possui os mesmos documentos (CPF e/ou CNPJ).", StringComparison.CurrentCultureIgnoreCase))))
                        {
                            LocalDB.AdicionarItemFila(conn, "revisar-resposta-car", item.Id, nextItem.Requisicao.Substring(0, nextItem.Requisicao.Length - 4), requisicao.empreendimento);
                        }
                        else
                        {
                            //Atualiza a Solicitacao do CAR
                            var situacaoSolicitacao = (resultadoEnvio.codigoResposta == MensagemRetorno.CodigoRespostaSucesso) ? ControleCarDB.SITUACAO_SOLICITACAO_VALIDO : ControleCarDB.SITUACAO_SOLICITACAO_PENDENTE;
                            ControleCarDB.AtualizarSolicitacaoCar(conn, requisicao, situacaoSolicitacao, tid);

                            //Atualizar controle de envio do SICAR
                            ControleCarDB.AtualizarControleSICAR(conn, resultadoEnvio, requisicao, ControleCarDB.SITUACAO_ENVIO_ARQUIVO_ENTREGUE, tid, arquivoFinal);
                        }

                        //Marcar como processado
                        LocalDB.MarcarItemFilaTerminado(conn, nextItem.Id, true, resultado);
                    }
                    catch (Exception ex)
                    {
                        //Marcar como processado registrando a mensagem de erro
                        var msg = ex.Message +
                                  Environment.NewLine +
                                  Environment.NewLine +
                                  resultado;

                        LocalDB.MarcarItemFilaTerminado(conn, nextItem.Id, false, msg);
                        ControleCarDB.AtualizarSolicitacaoCar(conn, requisicao.origem, requisicao.solicitacao_car, ControleCarDB.SITUACAO_SOLICITACAO_PENDENTE, tid);
                        ControleCarDB.AtualizarControleSICAR(conn, null, requisicao, ControleCarDB.SITUACAO_ENVIO_ARQUIVO_REPROVADO, tid);
                    }

                    System.Threading.Thread.Sleep(TimeSpan.FromSeconds(30));

                    nextItem = LocalDB.PegarProximoItemFila(conn, "enviar-car");

                    //Apagar arquivo do diretorio temporário
                    //TODO:NÃO VAI
                    //try
                    //{
                    //	File.Delete(pathArquivoTemporario + nextItem.Requisicao);
                    //}
                    //catch (Exception) { /*ignored*/ }
                }
            }

            Log.InfoFormat("ENDING {0} executing at {1}", jobKey, DateTime.Now.ToString("r"));
        }