Ir para o conteúdo principal

Integração entre os sistemas Consignação e Governa para troca de informações

Data de elaboração 17/16/2023
Responsável pelo estudo
  • Alef Carvalho da Silva (Analista)
Equipe do estudo
  • André Honório de Andrade Silva (Tecnico)
  • Gezinéia Paula da Costa (Product Owner)
  • Emanuel Rufino Alcantara de Lima (Analista)
  • Alef Carvalho (Analista)
  • Gustavo Felix (Analista)
Alvo Alpha Serviços
Origem

VING-1388:  Eu, Vingadores, preciso realizar um estudo sobre a integração da consignação com o governa

Objetivo

O presente estudo visa analisar a viabilidade técnica e propor soluções para a integração entre os sistemas Consignação e Governa.


1 - OBJETIVO

O Presente estudo objetiva levantar as formas de integração para consumo das informações sensíveis entre os sistemas Governa e Consignação.

1.1 JUSTIFICATIVA

Atualmente a troca de informações entre os dois sistemas de dá por meio da exportação e importação de arquivos de texto plano. O processo de transporte destes arquivos entre os sistemas é feito de maneira manual, desta forma não há qualquer garantia de integridade das informações transmitidas.

Além disso um grande volume de informação desnecessária é transmitido por meio destes arquivos visto que todos os registros do banco de dados são empacotados no arquivo. Durante o processo de leitura é feito a verificação de duplicidade das informações e nesse caso o registro do arquivo é ignorado, fazendo com que o processo de leitura do arquivo atualmente leve em torno de 4 (quatro) dias.

1.2 RESULTADOS ESPERADOS

Espera-se que, após este estudo, seja possível identificar se há viabilidade para construção da integração entre os sistemas, além dos meios e recursos técnicos necessários para tal.

2 - INTRODUÇÃO

[resumo intro sistema consignação]. [resumo intro sistema governa]

2.1 - GARANTIA DE INTEGRIDADE

Com a integração entre os dois sistemas há a possibilidade de se implantar técnicas de verificação da integridade dos arquivos visando garantir que os mesmos não foram alterados ou corrompidos durante a transmissão.

2.2 - MENOR TEMPO DE IMPORTAÇÃO 

A transmissão automática dos arquivos entre os sistemas tornará possível o envio somente das informações do fechamento atual, eliminando dados que já foram importados anteriormente e otimizando o tempo de leitura e importação dos arquivos.

3 - DESENVOLVIMENTO

3.1 CENÁRIO ATUAL 

Como já mencionado os dois sistemas são interdependentes, desta forma um usuário com permissões de administrador no sistema de consignação pode exportar ou importar os tipos de arquivo a seguir: 

Exportação:

        • Registro de averbações
        • Desconto de cartão de crédito

Importação:

        • Lotação
        • Cargo
        • Verba
        • Servidor
        • Pensionista
        • Margem
        • Averbação
        • Classificação
        • Retorno
        • Fixa e variável
        • Variável cartão
        • Retorno com CODAVB
        • Retorno data de crédito
        • Averbação de exclusão

3.2 POSSÍVEIS SOLUÇÕES

3.2.1 INTEGRAÇÃO VIA SERVIÇO DE MESSAGERIA

Nesta abordagem a transmissão e recepção manual dos arquivos é substituída por uma comunicação direta entre os dois sistemas por meio de um serviço de messageria RabbitMQ. 

Para tal deveremos adicionar as entradas abaixo no arquivo application.properties e em seguida adicionar as entradas correspondentes em cada arquivo de configuração de variáveis de ambiente.

sprint.rabbitmq.host=${RABBITMQ_HOST}
sprint.rabbitmq.port=${RABBITMQ_PORT}
sprint.rabbitmq.username=${RABBITMQ_USERNAME}
sprint.rabbitmq.password=${RABBITMQ_PASSWORD}
RABBITMQ_HOST={host do servidor rmq}
RABBITMQ_PORT=5672
RABBITMQ_USERNAME={usuário do servidor rmq}
RABBITMQ_PASSWORD={senha do servidor rmq}

Em seguida deveremos declarar a dependência necessária para conexão entre o Spring Boot e o servidor RabbitMQ no arquivo pom.xml

<dependency>
  <groupId>org.springframework.amqp</groupId>
  <artifactId>spring-rabbit</artifactId>
</dependency>

DeveráAs tambémfilas serde criadacomunicação umaentre os sistemas serão declaradas numa classe com propriedades estáticas no package de inicialização da conexão que será automaticamente inicializada pelo Sprint durante a inicialização da aplicação.constantes.

package br.com.gov.consignacao.constante;

public final class RMQ {
  public static String QUEUE_EXPORTACAO = "consignacao.exportacao";
  public static String QUEUE_IMPORTACAO = "consignacao.importacao";
}

Deverá também ser criada uma classe de inicialização da conexão que será automaticamente inicializada pelo Sprint durante a inicialização da aplicação.

package br.com.gov.consignacao.connections;

import br.com.gov.consignacao.constante;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class RabbitMQConectionRMQConnection {
  
  private static final String AMQP_EXCHANGE_NAME = "amq.direct";

  private AmqpAdmin amqpAdmin;

  public RabbitMQConection(RMQConnection(AmqpAdmin amqpAdmin){
    this.amqpAdmin = amqpAdmin;
  }

  private Queue getQueue(String nomeFila){
    return new Queue(nomeFila, true, false, false);
  }

  private DirectExchange getExchange() {
    return new DirectExchange(AMQP_EXCHANGE_NAME);
  }

  private Binding getBinding(Queue queue, DirectExchange exchange) {
    return new Binding(queue.getName(), Binding.DestinationType.QUEUE, exchange.getName(), queue.getName(), null);
  }

  //está função é executada assim que nossa classe é instanciada pelo Spring, devido a anotação @Component
  @PostConstruct
  private void setup() {
    
    DirectExchange directExchange = this.getExchange();
    
    Queue exportacaoQueue = this.getQueue(RMQ.QUEUE_EXPORTACAO);
    Queue importacaoQueue = this.getQueue(RMQ.QUEUE_IMPORTACAO);
    
    Binding exportacaoBinding = this.getBinding(exportacaoQueue, directExchange);
    Binding importacoBinding   = this.getBinding(importacaoQueue, directExchange);

    // registra as filas no RMQ
    this.amqpAdmin.declareQueue(exportacaoQueue);
    this.amqpAdmin.declareQueue(importacaoQueue);

    // registra a exchange no RMQ
    this.amqpAdmin.declareExchange(directExchange);

    // registra os bindings no RMQ
    this.amqpAdmin.declareBinding(exportacaoBinding);
    this.amqpAdmin.declareBinding(importacoBinding);
    
  }

3.3 POSSÍVEIS IMPEDIMENTOS

4 - CONCLUSÃO

5 - REFERÊNCIAS