spring-batch 相关问题

Spring Batch是一个轻量级,全面的框架,旨在实现对企业系统日常运营至关重要的批处理应用程序的开发。此上下文中的批处理应用程序是指针对批量数据处理的自动离线系统。

如何让JobRegistry包含Spring批处理服务器重启时的作业信息

我们有一个场景,每当作业执行 STARTED 状态时,服务器可能会崩溃。在这种情况下,要重新启动批处理,我从这里理解了服务器故障后 Spring Batch 恢复,...

回答 1 投票 0

从 ChunkContext 读取 JobParameter 时,从 4.x 到 5.x 的 Spring 批量迁移面临意外问题

我有一个 DTO 课程,如下所示 @盖特 @塞特 @数据 公共类 JobDetailsDTO 实现可序列化 { 私有 HashMap> 参数; 公共空间

回答 1 投票 0

如何使用Spring Batch读取mongo集合的所有文档?

我必须在 Spring Batch 期间从 MongoDB 读取整个集合而不使用过滤器。 我创建了一个扩展 MongoItemReader 的类 XyzMongoItemReader 在 XyzMongoItemReader 构造函数上我觉得...

回答 1 投票 0

使用 Spring Batch 集成进行文件监控和处理

我目前正在学习 spring-batch-integration,为此我想创建一个应用程序来监视指定目录中的 txt 文件,然后如果该文件存在则启动批处理作业...

回答 1 投票 0

Spring Batch 抛出错误“对象‘BATCH_JOB_SEQ’不是序列对象”

我正在开发一个 Spring Batch 项目,我使用 SQL Server 作为本地数据库,使用此链接为批次创建数据库脚本,但现在出现以下给定的错误。 23463 [主要] 警告 o.s.b.c.c.a.

回答 2 投票 0

如何通过 spring-batch-admin 检查 Spring Batch 作业的状态,该作业的实例当前是否正在执行?

我有一个要求,我使用 spring-batch-admin JSON api 创建了一个用于 spring-batch 监控的自定义 UI。我有一个要求,我不想让用户在

回答 1 投票 0

Spring Batch 5:如何不使用内部 Spring Batch 表?

我正在将我的 Spring Boot Spring Batch 应用程序从 Spring Batch 4.x 迁移到 5.0 (这是 Spring Boot 2.6.6 到 3.1.3 迁移的一部分)。 在我们的批处理应用程序中,我们不使用任何弹簧批处理

回答 1 投票 0

Spring Batch 5:如何不使用内部 Spring Batch 表?

我正在将我的 Spring Boot Spring Batch 应用程序从 Spring Batch 4.x 迁移到 5.0 (这是 Spring Boot 2.6.6 到 3.1.3 迁移的一部分)。 在我们的批处理应用程序中,我们不使用任何弹簧批处理

回答 1 投票 0

读取批处理作业参数并向内置 Spring Batch 指标添加自定义标签

我想向 Spring Batch 的内置指标添加自定义标签。 例如,开箱即用的 Spring Batch 带有以下内容: https://docs.spring.io/spring-batch/docs/current/reference/html/monitor...

回答 1 投票 0

spring批处理:需要一个名为“dataSource”的bean,但无法找到

我正在将 Spring Boot 从版本 2.6.6 升级到 3.1.3。 我通过参考此软件帖子进行了所需的 JobRepository 相关修改。 一切似乎都很顺利,但接下来我面临的是下面

回答 1 投票 0

在 Spring Batch 中加载和处理大量数据

我们有一个用例,使用以下连接资源代码将 100M 记录从共享对象存储桶加载到 Mongo DB HttpURLConnection httpConnection = null; 尝试 { http连接 = (

回答 1 投票 0

使用Spring批处理在数据库中导入CSV:RepositoryItemWriter没有使用JPA插入MySQL数据库

我有一个 CSV 文件,我必须将其导入到 mysql 数据库中。它的大小超过8Go。 为此,我开始研究 Spring Batch 来解决我的问题。我首先创建了一个 Spring Batch 应用程序: 我有一个 CSV 文件,我必须将其导入到 mysql 数据库中。它的大小超过8Go。 为此,我开始研究 Spring Batch 来解决我的问题。我首先创建了一个 Spring Batch 应用程序: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>fr.test.batch</groupId> <artifactId>mysql-import</artifactId> <version>0.0.1-SNAPSHOT</version> <name>mysql-import-batch</name> <description>mysql-import-batch</description> <properties> <java.version>17</java.version> <fasterxml.jackson.version>2.15.2</fasterxml.jackson.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency> <!-- Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.33 --> <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${fasterxml.jackson.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${fasterxml.jackson.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${fasterxml.jackson.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml --> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>${fasterxml.jackson.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>${fasterxml.jackson.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> 我的 CSV 文件有一整套列: Siren,nic,siret,statutDiffusionEtablissement,dateCreationEtablissement.. 并且 CSV 不包含任何主键。我也在使用 JPA,为此我创建了一个实体: @Entity @Table(name="establishments") @Data @AllArgsConstructor @NoArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) public class EstablishmentEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @JsonProperty(value="siren") @JsonAlias("siren") private String siren; @JsonProperty(value="icn") @JsonAlias("nic") private String icn; @JsonProperty(value="siret") @JsonAlias("siret") private String siret; ... } 我也有一个存储库: @Repository public interface EstablishmentRepository extends CrudRepository<EstablishmentEntity, Long> { } 现在我尝试配置一个批处理类: @Configuration @EnableBatchProcessing @EnableTransactionManagement public class InseeBatchConfiguration { private static final Logger log = LoggerFactory.getLogger(InseeBatchConfiguration.class); //Reader class Object @Bean public FlatFileItemReader<EstablishmentEntity> reader() { log.warn("reader() called"); return new FlatFileItemReaderBuilder<EstablishmentEntity>() .name("establishmentItemReader") .resource(new FileSystemResource("D:\\StockEtablissement_utf8.csv")) .delimited() .names("siren", "nic", "siret", "statutDiffusionEtablissement", "dateCreationEtablissement"...) .fieldSetMapper(new BeanWrapperFieldSetMapper<>() {{ setTargetType(EstablishmentEntity.class); }}) .build(); @Bean public EstablishmentItemProcessor processor() { log.warn("processor() called"); return new EstablishmentItemProcessor(); } //Writer class Object @Bean public RepositoryItemWriter<EstablishmentEntity> writer(EstablishmentRepository repository) { log.warn("writer() called"); return new RepositoryItemWriterBuilder<EstablishmentEntity>() .repository(repository) .methodName("save") .build(); } @Bean public Job importJob( JobRepository jobRepository, BatchListener listener, Step step1) { log.warn("importJob() called"); return new JobBuilder("import", jobRepository) .incrementer(new RunIdIncrementer()) .listener(listener) .flow(step1) .end() .build(); } @Bean public Step step1( JobRepository jobRepository, PlatformTransactionManager transactionManager, RepositoryItemWriter<EstablishmentEntity> writer) { log.warn("step() called"); return new StepBuilder("step1", jobRepository) .<EstablishmentEntity, EstablishmentEntity> chunk(10, transactionManager) .reader(reader()) .processor(processor()) .writer(writer) .build(); } } 主要方法如下: public static void main(String[] args) { // SpringApplication.run(MysqlImportBatchApplication.class, args); System.exit(SpringApplication.exit(SpringApplication.run(MysqlImportBatchApplication.class, args))); } 我有以下应用程序属性: #mysql database connection spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url = jdbc:mysql://localhost:3306/insee?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false spring.datasource.username = root spring.datasource.password = root spring.jpa.generate-ddl=true #disabled job run at startup #----------ORM Details------------------- #To display SQL At console spring.jpa.show-sql=true #To Create tables spring.jpa.hibernate.ddl-auto=update #To Generate SQL queries spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect #----------Spring Batch Properties---------- # By default it's true which means all the Spring batches will start executing automatically spring.batch.job.enabled=false # Tables for metadata created by Spring Boot (Always, Embedded, Never) spring.batch.jdbc.initialize-schema=ALWAYS 当我启动运行主方法的应用程序时,应用程序正确启动,如果不存在但没有写入数据,则创建表 根据 Mahmoud Ben Hassine 的回答,我更新了我的代码: 1。实现 JpaTransactionManager @Bean public JpaTransactionManager transactionManager() throws SQLException { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject()); transactionManager.setDataSource(entityManagerFactoryBean().getDataSource()); return transactionManager; } @Bean(name = "entityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() throws SQLException { LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); entityManagerFactoryBean.setJpaVendorAdapter(vendorAdaptor()); entityManagerFactoryBean.setDataSource(datasource()); entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); entityManagerFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN); entityManagerFactoryBean.setJpaProperties(jpaHibernateProperties()); entityManagerFactoryBean.setJpaDialect(new HibernateJpaDialect()); return entityManagerFactoryBean; } private HibernateJpaVendorAdapter vendorAdaptor() { HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setShowSql(true); return vendorAdapter; } @Bean(name = "dataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource datasource() { HikariConfig config = new HikariConfig(); config.setJdbcUrl(env.getProperty("spring.datasource.url")); config.setUsername(env.getProperty("spring.datasource.username")); ... config.setPassword(env.getProperty("spring.datasource.password")); config.setMinimumIdle(Integer.parseInt( Properties props = new Properties(); props.put( "spring.datasource.hikari.data-source-properties.cachePrepStmts", env.getProperty("spring.datasource.hikari.data-source-properties.cachePrepStmts")); ... config.setDataSourceProperties(props); log.warn("## datasource() called"); return new HikariDataSource(config); } private Properties jpaHibernateProperties() { Properties properties = new Properties(); ... properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); //properties.put(AvailableSettings.JAKARTA_HBM2DDL_DATABASE_ACTION, "none"); return properties; } 2。我也更新了我的step1。 @Bean public Step step1( BatchReadListener listener, JobRepository jobRepository, JpaTransactionManager transactionManager, RepositoryItemWriter<EstablishmentEntity> writer) throws IOException { log.warn("step() called"); return new StepBuilder("step1", jobRepository) .<EstablishmentEntity, EstablishmentEntity> chunk(10, transactionManager) .reader(reader()) .processor(processor()) .writer(writer) .listener(listener) .build(); } 我还添加了一个监听器用于测试目的。 @Service public class BatchReadListener implements ItemReadListener<EstablishmentEntity> { @Override public void beforeRead() { // ItemReadListener.super.beforeRead(); System.out.println("Before reading ..."); } @Override public void afterRead(EstablishmentEntity item) { System.out.println("After reading ..."); System.out.println("## " + item.getSiret()); } @Override public void onReadError(Exception ex) { ex.printStackTrace(); // ItemReadListener.super.onReadError(ex); } } 启动应用程序时,数据仍未存储在数据库中。我确实有有关数据库连接的日志: HikariPool-1 - Fill pool skipped, pool has sufficient level or currently being filled (queueDepth=0). HikariPool-1 - Pool stats (total=10, active=0, idle=10, waiting=0) HikariPool-1 - Fill pool skipped, pool has sufficient level or currently being filled (queueDepth=0). HikariPool-1 - Pool stats (total=10, active=0, idle=10, waiting=0) HikariPool-1 - Fill pool skipped, pool has sufficient level or currently being filled (queueDepth=0). HikariPool-1 - Closing connection com.mysql.cj.jdbc.ConnectionImpl@61c9d64b: (connection has passed maxLifetime) RepositoryItemWriter基于JPA存储库,因此您需要确保步骤中自动装配的PlatformTransactionManager transactionManager是JpaTransactionManager类型,而不是DataSourceTransactionManager或JdbcTransactionManager(这似乎是默认类型)由 Spring Boot 自动配置)。 您可以将步骤签名更改为: @Bean public Step step1( JobRepository jobRepository, JpaTransactionManager transactionManager, RepositoryItemWriter<EstablishmentEntity> writer) { ... } 这将使错误变得明显,即如果上下文中没有定义 JpaTransactionManager bean,应用程序将无法启动。

回答 1 投票 0

Spring 批处理和 Kubernetes cron 作业

我正在尝试配置通过 Kubernetes cron 作业触发的 Spring 批处理作业。我配置了作业、分区和步骤。该作业可以通过 Kubernetes cron 作业触发。 弹簧靴

回答 1 投票 0

Spring Batch 表中的 ID 增加 20

Spring 批处理表中的 ID 字段增加 20。 对于所有春季批次表都是如此 如何将Spring Batch表中的ID一一增加? 示例表 BATCH_JOB_EXECUTION

回答 1 投票 0

避免在 Spring Batch 5 中创建元数据表

如何在 Spring Batch 5(Spring Boot 3)中禁用元数据表的创建。我在日志 org.springframework.jdbc.BadSqlGrammarException 中看到以下异常:PreparedStatementCallb...

回答 1 投票 0

了解 BATCH_STEP_EXECUTION 中的 COMMIT_COUNT

运行 Spring Batch 作业时,我在 BATCH_STEP_EXECUTION 表中看到了我不理解的 COMMIT_COUNT 数据。 这项工作相当简单。这是带有

回答 1 投票 0

运行 Kubernetes 调度的 Spring Batch

我有一个 Spring Batch 作业并将其部署在 Kunernetes 上。我还使用 Kubernetes cronjob 配置每天上午 10 点运行它。像这样的例子 api版本:batch/v1 种类:CronJob 元数据: 名称: 你好...

回答 1 投票 0

如何避免在步骤1完成之前调用步骤2的Reader构造函数?

Reader1 从 .csv 文件读取,Processor1 生成不同的输出,Writer1 将其存储在 RECORD 表中,同时还将文件存储在 FILE 表中,并以自动生成的 ID 作为主...

回答 1 投票 0

在 Spring 批处理作业中创建窥视阅读器实例时出现问题

我有大师步 @豆 公共步骤employeeMasterProfilePhoneStep()抛出UnexpectedInputException,ParseException { 返回stepBuilderFactory.get(Constant.MASTER_PHONE_STEP) .

回答 1 投票 0

spring batch RepositoryItemWriter不将数据写入数据库

@配置 公共类数据源配置{ @豆 @ConfigurationProperties(“spring.datasource”) 公共数据源appDataSource() { DataSourceBuilder 构建器 =

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.