Alura > Cursos de Programação > Cursos de Java > Conteúdos de Java > Primeiras aulas do curso Java e Spring: Realizando processamento em lote com Spring Batch

Java e Spring: Realizando processamento em lote com Spring Batch

Entendendo o processamento em lote - Apresentação

Olá, sou a Jacqueline Oliveira, engenheira de software e instrutora na Alura.

Audiodescrição: Jaqueline é uma mulher de pele branca, com cabelos louros longos e olhos castanhos. Ela está vestindo uma blusa amarela e, em seu ambiente de trabalho, a luz de fundo é azul.

Boas-vindas a mais um curso de Java Spring, este focado em processamento em lote usando Spring Batch. O processamento em lotes é uma realidade na maioria das empresas, e muitas tarefas são projetadas para serem realizadas desta forma, quando não há necessidade de execução em tempo real, e esse conhecimento será muito importante.

Vamos trabalhar no projeto CodeChella, um site responsável pela venda de ingressos para eventos que gera arquivos CSV para que uma empresa terceirizada faça a emissão dos tickets. Realizaremos o processamento em lotes a partir do arquivo CSV, para o armazenamento no banco de dados por parte da empresa que vai gerar os tickets, que, no nosso caso, será a CodeTickets.

É importante saber que, para melhor aproveitamento deste curso, é fundamental ter conhecimento prévio em Java Spring, além de ter feito os cursos de pré-requisito. O foco não será no aprendizado da linguagem Java nem do Spring passo a passo. Vamos começar?

Entendendo o processamento em lote - Iniciando um projeto com Spring Batch

Nossa aplicação se chama CodeChella, um site que vende ingressos para grandes eventos, como shows muito concorridos, por exemplo, Rock in Rio, Taylor Swift, Bruno Mars. São shows que visam vender quantidades enormes de ingressos, e possuem grande infraestrutura, com pista, pista premium, camarote, entre outros.

Não trabalharemos programando o CodeChella, e sim atuando como uma empresa terceirizada que emite os bilhetes adquiridos nas vendas. O envio de informações para a empresa terceirizada será feito via processamento em lote, técnica usada para executar uma série de operações de grande volume de forma automatizada, sem interação constante. Isso pode ser feito em um momento específico, por exemplo, ao final do dia.

Utilizaremos o Spring Batch, o framework do Spring, para realizar o processamento em lote. Vamos abrir o site "start.spring.io" e escolher o Maven como gerenciador (em "Project"), a linguagem Java ("Language"), e a versão 3.3.2 ("Spring Boot"). No grupo ("Project Metadata"), colocaremos br.com.alura e, tanto em artefato ("Artifact") quanto em nome ("Name"), deixaremos codetickets, pois não estamos mais trabalhando com o CodeChella, e sim com o emissor de tickets. O empacotamento ("Packaging") será em Jar na versão 21, que é a última LTS no momento do curso.

Quais dependências vamos usar? Primeiramente, o Spring Batch, que fará nosso processamento em lote, depois, a Spring Data JPA para trabalharmos com a persistência nas tabelas do banco e também o PostgresSQL Driver. Vamos gerar e fazer o download do CodeTickets em versão zipada. Descompactaremos e abriremos o arquivo na IDE IntelliJ. Teremos uma aplicação padrão do Spring, com uma classe CodeticketsApplication que executaremos, e que possui a anotação @SpringBootApplication.

Para criarmos o banco no pgAdmin, no menu lateral esquerdo, clicaremos com o lado direito do mouse em "Databases" e escolheremos "Create > Database...". Nomearemos o banco de dados como codetickets_db. Sabemos, de outros cursos, que será necessário configurar o acesso ao banco no application.properties. As URLs padrões incluem:

spring.application.name=codetickets

spring.datasource.url=jdbc:postgresql://localhost/codetickets_db
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASSWORD}

O nome de usuário e a senha são armazenados em uma variável de ambiente. Para o Spring Batch, incluiremos uma propriedade para inicializar algumas tabelas no banco, que servirão para registrar a execução dos jobs e o tempo, e gerar métricas. A propriedade é:

spring.batch.jdbc.initialize-schema=always

Lembrando que um job é uma tarefa que processa uma quantidade finita de dados sem interação ou interrupção. Vamos programá-lo, e ele processará e gerará resultados. Nosso objetivo é ler os dados dos clientes que compraram tickets e grav-alos no banco para emissão.

Vamos executar a aplicação clicando no símbolo de play, um triângulo verde apontando para a direita na barra de menu superior direito da IDE, para vermos as tabelas criadas no banco de dados. Após a execução finalizar com sucesso, ao atualizarmos o "codetickets_db" na barra lateral esquerda do pgAdmin clicando com o lado direito do mouse e em "Refresh...", e depois em "Schemas > Tables", teremos que batch_job_execution, batch_job_execution_context, batch_job_execution_params, batch_job_instance, batch_step_execution e batch_step_execution_context foram criadas.

Ao longo do curso, entenderemos cada detalhe, o que é um job, um step, e como o Spring Batch nos auxilia nesse processo. Esse foi nosso primeiro passo para construir a aplicação. Em breve, codificaremos mais. Prepare seu ambiente, e nos vemos na sequência.

Entendendo o processamento em lote - Estruturando o projeto

Nosso objetivo é processar um arquivo CSV enviado pelo pessoal do CodeChella e, como emissores de tickets, disparar um job para ler esse arquivo e salvar as informações no banco de dados. Para isso, é necessário uma tabela onde essas informações serão armazenadas. Inicialmente, disponibilizaremos um arquivo pequeno chamado dados.csv.

Na aplicação, criaremos uma pasta chamada "files", em que colocaremos o dados.csv. Ao abrirmos o arquivo, observamos que há o CPF da pessoa compradora, o nome, data de nascimento, o show escolhido (como Roberto Carlos, por exemplo), a data do show, o tipo do ingresso e o valor pago. Os campos estão separados por ponto e vírgula, conhecido como delimitador do arquivo CSV. Cada linha representa uma pessoa que comprou um ingresso e o show correspondente, como Anitta, Caetano Veloso ou um show no Rock in Rio.

Para representar essas informações na tabela, inicialmente, em vez de criar tabelas separadas para eventos, outra para clientes e outra para ingressos, podemos consolidar tudo em uma única tabela no projeto, representada por uma classe no banco de dados.

Clicaremos com o lado direito do mouse em "src > main > java > br.com.alura.codetickets" na barra lateral esquerda da IDE e usaremos "Alt + Insert" para criarmos uma classe Java chamada Importacao. Essa classe representará uma tabela no banco de dados e deve ser anotada com @Entity e @Table. Não utilizaremos um nome diferenciado, então a tabela será Table, conforme o padrão do Jakarta.

Inseriremos private Long id, anotado com @Id, também por conta do Jakarta Persistence, e @GeneratedValue, utilizando a estratégia para um ID auto-incrementável. Não precisaremos de um Enum do tipo Evento, poderemos recebê-la como String, e posteriormente teremos passos no nosso job para validação e tratamento dos dados. Também incluiremos um campo adicional para registrar a data da importação, que não está presente no CSV, mas será alimentado ao persistir os dados na tabela.

@Entity
@Table
public class Importacao {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String cpf;
    private String cliente;
    private LocalDate nascimento;
    private String evento;
    private LocalDate data;
    private String tipoIngresso;
    private Double valor;
    private LocalDateTime horaImportacao;
}

Após definirmos os campos, geraremos os getters e setters de todos eles, via atalho "Alt + Insert". Precisaremos configurar a propriedade de auto-atualização no application.properties para que o JPA crie as tabelas automaticamente. Acrescentaremos no arquivo spring.jpa.hibernate.ddl-auto=update.

Executaremos a aplicação para confirmar que a tabela foi criada corretamente no banco de dados. No pgAdmin, fazemos um refresh (atualização) nas tabelas para começarmos a programar o job de importação. Geraremos o script de select para visualização dos campos clicando em "importacao" dentre as tabelas, no menu lateral esquerdo, e em "Scripts > SELECT Script". Clicaremos no botão de executar e confirmaremos que o ID é a chave primária e que os campos estão ordenados alfabeticamente pelo JPA de forma automática. Caso desejemos uma configuração diferente, podemos rodar um script de migration ou usar outra configuração.

Assim, incluímos um novo arquivo ao projeto na pasta "files" e criamos uma nova classe que representa a tabela no banco, onde gravaremos os dados lidos do CSV. Com isso, a estrutura do projeto está pronta para começarmos a construção do job. Vamos nos preparar para mergulhar no Spring Batch.

Sobre o curso Java e Spring: Realizando processamento em lote com Spring Batch

O curso Java e Spring: Realizando processamento em lote com Spring Batch possui 143 minutos de vídeos, em um total de 42 atividades. Gostou? Conheça nossos outros cursos de Java em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Java acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas