Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Tabelas batch não estão sendo criadas no postgresql

Olá pessoal!

Seguindo o curso de Spring Batch ao executar o job notei que as tabelas que devem ser criadas pelo Spring batch automaticamente não foram criadas no meu banco, porém a conexão com o banco está correta uma vez que ao rodar o programa ele executa sem erros, a tabela importacao foi criada tendo salvo as informações contida no arquivo dados.csv na tabela . Não estou conseguindo identificar o quê esta faltando para que o Spring Batch possa criar as tabelas e gerenciar os logs no postgres já que por default ele vem configurado para fazer esse gerenciamento em bancos em mémorias como o H2 por exemplo.

Como meu projeto foi criado, note que estou utilizando a versão 4.1.1 ou invés da 3.2.2 sugerida no curso já que ela esta defasada:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Meu application.yaml, ele esta com algumas configurações a mais devido as tentativas de solucionar o problema:

spring:
    application:
        name: codetickets

    datasource:
        url: jdbc:postgresql://localhost:5432/codetickets
        jdbc-url: jdbc:postgresql://localhost:5432/codetickets
        username: "${POSTGRES_USERNAME}"
        password: "${POSTGRES_PASSWORD}"
        driver-class-name: org.postgresql.Driver

    batch:
        jdbc:
            initialize-schema: always

    jpa:
        hibernate:
            ddl-auto: update

logging:
    level:
        org.springframework.batch: DEBUG
        org.springframework.jdbc.core: DEBUG

Meu ImportacaoJobConfiguration:

@Configuration
public class ImportacaoJobConfiguration {

    private final PlatformTransactionManager transactionManager;

    public ImportacaoJobConfiguration(PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }

    @Bean
    public Job job(Step passoInicial, JobRepository jobRepository) {
        return new JobBuilder("geracaoTickets", jobRepository)
                .start(passoInicial)
                .incrementer(new RunIdIncrementer())
                .build();
    }

    @Bean
    public Step passoInicial(ItemReader<Importacao> reader, ItemWriter<Importacao> writer,
            JobRepository jobRepository) {
        return new StepBuilder("passoInicial", jobRepository)
                .<Importacao, Importacao>chunk(200)
                .transactionManager(transactionManager)
                .reader(reader)
                .writer(writer)
                .build();
    }

    @Bean
    public ItemReader<Importacao> reader() {
        return new FlatFileItemReaderBuilder<Importacao>()
                .name("leituraCsv")
                .resource(new FileSystemResource("files/dados.csv"))
                .comments("--")
                .delimited()
                .delimiter(";")
                .names(
                        "cpf",
                        "cliente",
                        "nascimento",
                        "evento",
                        "data",
                        "tipoIngresso",
                        "valor")
                .fieldSetMapper(new ImportacaoMapper())
                .build();
    }

    @Bean
    public ItemWriter<Importacao> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<Importacao>()
                .dataSource(dataSource)
                .sql("""
                        INSERT INTO importacao (
                            cpf, cliente, nascimento, evento, data, tipo_ingresso, valor, hora_importacao)
                        VALUES (
                            :cpf, :cliente, :nascimento, :evento, :data, :tipoIngresso, :valor, LOCALTIMESTAMP(0))
                        """)
                .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
                .build();
    }
}

Como alternativa até criei as tabelas manualmente usando o script, mas ao executar a aplicação nenhum registro foi salvo nelas.

1 resposta

Olá, Jards! Tudo bem?

Parece que você está enfrentando um problema comum quando se utiliza o Spring Batch com bancos de dados diferentes do H2. Vamos tentar resolver isso juntos.

  1. Verifique a configuração do initialize-schema: Você já configurou spring.batch.jdbc.initialize-schema: always, o que está correto para garantir que as tabelas sejam criadas automaticamente. No entanto, certifique-se de que essa configuração está sendo aplicada corretamente. Às vezes, problemas de cache ou de contexto podem impedir que as configurações sejam lidas corretamente.

  2. Dependências do Maven: Certifique-se de que as dependências do Spring Batch e do driver do PostgreSQL estão corretamente configuradas no seu pom.xml. Algo como:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    
  3. Verifique os logs: Como você já configurou o nível de log para DEBUG, verifique se há mensagens nos logs que possam indicar o porquê das tabelas não estarem sendo criadas. Isso pode dar uma pista se há algum erro ou configuração faltando.

  4. Versão do Spring Boot: Você mencionou que está usando a versão 4.1.1. Certifique-se de que todas as suas dependências são compatíveis com essa versão. Às vezes, incompatibilidades de versão podem causar comportamentos inesperados.

  5. Permissões no Banco de Dados: Verifique se o usuário do banco de dados tem as permissões necessárias para criar tabelas. Isso pode ser verificado executando um simples comando de criação de tabela manualmente no banco.

  6. Scripts SQL: Como alternativa, você pode verificar se os scripts SQL de criação de tabela do Spring Batch estão sendo carregados. Eles geralmente estão localizados em org/springframework/batch/core/schema-postgresql.sql dentro do jar do Spring Batch. Você pode executá-los manualmente para garantir que as tabelas estejam no lugar.

Espero ter ajudado e fico à disposição se precisar.

Abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado