Spring Batch是一个轻量级,全面的框架,旨在实现对企业系统日常运营至关重要的批处理应用程序的开发。此上下文中的批处理应用程序是指针对批量数据处理的自动离线系统。
我需要根据从服务发送的对计数重复“n”次deleteStep和insertStep。这是批处理配置,每个步骤运行一次并删除和插入 r...
如何在 Spring Batch 5.x 中运行作业而不在数据库中创建批处理元数据条目
根据 Spring Batch 5.x,我们必须在数据库中创建元数据表,因此我在数据库中看到了很多我试图避免的条目。有没有办法可以避免在...
如何在Spring Batch ItemReader中访问JobParameters?
我正在尝试访问 ItemReader 中的作业参数,如下所示,但是当尝试某些值时,无法传递该值,或者出现一些错误,例如 “未能初始化阅读器:无法确定...
我有两份工作(Job1,Job2) Job2 依赖于 job1 的结果,因此必须等到 job 1 完成 我需要以某种方式链接它们: 当 job1 完成时,它需要调用 job2。怎么办?...
MultiResourceItemReader 未按预期工作
我一直在使用FlatFileItemReader并一一处理文件。但我尝试使用 MultiResourceItemReader 并一次提供所有文件,过滤后有 3 个 CSV 文件和一个...
我正在尝试在本地启动 Spring Cloud 数据流。默认情况下,SCDF 使用 h2 作为主数据库来存储元信息。在我的云任务批处理应用程序中,所有与数据库相关的属性......
如何使用 Spring Batch 在 Spring Cloud 任务中使用声明式事务管理
春季启动2.5.4 我的问题是我没有成功管理事务:当我用 @Transactionnal 注释我的服务层和 dao 时,当我在同一服务中连续调用 dao 时...
Spring Batch 数据库依赖将参数传递给 SQL 语句
我想将sql从batch.xml文件中分离出来,所以我将sql语句定义到一个属性文件中。在batch.xml 中,我绑定了属性占位符bean,然后指向属性文件。 ...
获取springboot中@Schedule作业的上一次执行时间
我正在寻找一个选项来获取@Scheduled 任务的最后执行时间。所以我想用它来检索上次执行时间的数据库记录。 Quartz 依赖并存储
我对Spring批处理非常陌生,试图制作一个独立的Spring批处理(没有springboot),从MySql DB读取并将结果写入CSV。 我尝试谷歌搜索但没有任何结果。我也...
使用 Spring Batch JdbcCursorItemReader 和 NamedParameters
Spring Batch JdbcCursorItemReader 可以接受preparedStatementSetter: Spring Batch JdbcCursorItemReader 可以接受 preparedStatementSetter: <bean id="reader" class="org.springframework.batch.item.database.JdbcCursorItemReader"> <property name="dataSource" ref="..." /> <property name="sql" value="SELECT * FROM test WHERE col1 = ?"> <property name="rowMapper" ref="..." /> <property name="preparedStatementSetter" ref="..." /> </bean> 如果 sql 使用 ? 作为占位符,则效果很好,如上面的示例所示。然而,我们预先存在的 sql 使用命名参数,例如SELECT * FROM test WHERE col1 = :param . 有没有办法让 JdbcCursorItemReader 与 NamedPreparedStatementSetter 而不是简单的PreparedStatementSetter 一起使用? 谢谢 您可以尝试使用jobParameters。在这种情况下,您不需要任何PreparedStatementSetter。 <bean id="reader" class="org.springframework.batch.item.database.JdbcCursorItemReader"> <property name="dataSource" ref="..." /> <property name="sql" value="SELECT * FROM test WHERE col1 = #{jobParameters['col1']"> <property name="rowMapper" ref="..." /> <property name="preparedStatementSetter" ref="..." /> </bean> 运行作业时传递值 JobParameters param = new JobParametersBuilder().addString("col1", "value1").toJobParameters(); JobExecution execution = jobLauncher.run(job, param); 一旦我们没有来自 Spring 的官方解决方案,我们可以使用一个简单的方法来解决这个问题: 定义一个接口来提供SqlParameters: import org.springframework.jdbc.core.namedparam.SqlParameterSource; public interface SqlParameterSourceProvider { SqlParameterSource getSqlParameterSource(); } 扩展JdbcCursorItemReader并添加namedParameter功能。 import org.springframework.batch.item.database.JdbcCursorItemReader; import org.springframework.jdbc.core.SqlTypeValue; import org.springframework.jdbc.core.StatementCreatorUtils; import org.springframework.jdbc.core.namedparam.*; import org.springframework.util.Assert; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.*; public class NamedParameterJdbcCursorItemReader<T> extends JdbcCursorItemReader<T> { private SqlParameterSourceProvider parameterSourceProvider; private String paramedSql; public NamedParameterJdbcCursorItemReader(SqlParameterSourceProvider parameterSourceProvider) { this.parameterSourceProvider = parameterSourceProvider; } @Override public void setSql(String sql) { Assert.notNull(parameterSourceProvider, "You have to set parameterSourceProvider before the SQL statement"); Assert.notNull(sql, "sql must not be null"); paramedSql = sql; super.setSql(NamedParameterUtils.substituteNamedParameters(sql, parameterSourceProvider.getSqlParameterSource())); } @Override protected void applyStatementSettings(PreparedStatement stmt) throws SQLException { final ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(paramedSql); final List<?> parameters = Arrays.asList(NamedParameterUtils.buildValueArray(parsedSql, parameterSourceProvider.getSqlParameterSource(), null)); for (int i = 0; i < parameters.size(); i++) { StatementCreatorUtils.setParameterValue(stmt, i + 1, SqlTypeValue.TYPE_UNKNOWN, parameters.get(i)); } } } 创建实现接口 SqlParameterSourceProvider 的具体类,并具有包含要在查询中使用的参数的更新值的状态。 public class MyCustomSqlParameterSourceProvider implements SqlParameterSourceProvider { private Map<String, Object> params; public void updateParams(Map<String, Object> params) { this.params = params; } @Override public SqlParameterSource getSqlParameterSource() { final MapSqlParameterSource paramSource = new MapSqlParameterSource(); paramSource.addValues(params); return paramSource; } } 最后,更新spring配置。 <bean id="reader" class="org.wisecoding.stackoverflow.NamedParameterJdbcCursorItemReader"> <constructor-arg ref="sqlParameterSourceProvider"/> <property name="dataSource" ref="..." /> <property name="sql" value=SELECT * FROM test WHERE col1 = :param" /> <property name="rowMapper" ref="..." /> <property name="preparedStatementSetter" ref="..." /> </bean> <bean id="sqlParameterSourceProvider" class="org.wisecoding.stackoverflow.MyCustomSqlParameterSourceProvider"> </bean> 目前还没有办法做到这一点。 JdbcCursorItemReader 使用原始 JDBC (PreparedStatement),而不是底层的 Spring JdbcTemplate(因为使用 JdbcTemplate 时无法获取底层 ResultSet)。 如果您想将此作为一项新功能贡献,或请求将其作为一项新功能,请随时访问 jira.spring.io 原始解决方案位于https://jira.spring.io/browse/BATCH-2521,但不支持id in (:ids)子句。 这是一个增强功能。 import lombok.Setter; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.springframework.batch.item.database.JdbcCursorItemReader; import org.springframework.jdbc.core.PreparedStatementCreatorFactory; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterUtils; import java.util.Map; @Slf4j public class NamedParameterJdbcCursorItemReader<T> extends JdbcCursorItemReader<T> { protected void setNamedParametersSql(String sql, Map<String, Object> parameters) { val parsedSql = NamedParameterUtils.parseSqlStatement(sql); val paramSource = new MapSqlParameterSource(parameters); val sqlToUse = NamedParameterUtils.substituteNamedParameters(parsedSql, paramSource); val declaredParams = NamedParameterUtils.buildSqlParameterList(parsedSql, paramSource); val params = NamedParameterUtils.buildValueArray(parsedSql, paramSource, null); val pscf = new PreparedStatementCreatorFactory(sql, declaredParams); val pss = pscf.newPreparedStatementSetter(params); log.info("sql: {}", sqlToUse); log.info("parameters: {}", parameters); setSql(sqlToUse); setPreparedStatementSetter(pss); } } 用途: @Slf4j public class UserItemJdbcReader extends NamedParameterJdbcCursorItemReader<UserEntity> { @PostConstruct public void init() { val sql = "SELECT * FROM users WHERE id IN (:ids)"; val parameters = new HashMap<String, Object>(4); parameters.put("ids", Arrays.asList(1,2,3)); setDataSource(dataSource); setRowMapper(new UserRowMapper()); setNamedParametersSql(sql, parameters); } } 就我而言,我重用了 spring-jdbc 中的 ArgumentPreparedStatementSetter private static final String SQL = "SELECT * FROM payments.transactions WHERE time_stamp >= ? AND time_stamp <= ?"; ... Object[] args = new Object[2]; args[0] = new Date(Instant.now().minus(7, ChronoUnit.DAYS).toEpochMilli()); args[1] = new Date(); ArgumentPreparedStatementSetter argumentPreparedStatementSetter = new ArgumentPreparedStatementSetter(args); return new JdbcCursorItemReaderBuilder<>() .name("dbReader") .sql(SQL) .preparedStatementSetter(argumentPreparedStatementSetter) ...
Spring Batch 注释没有 XML 将参数传递给 Item Readere
我创建了一个简单的 Boot/Spring Batch 3.0.8.RELEASE 作业。我创建了一个简单的类,它实现了 JobParametersIncrementer 来访问数据库,查找查询应该查找多少天......
为什么我会收到此错误? - SLF4J:类路径包含多个 SLF4J 绑定
错误:- SLF4J:类路径包含多个 SLF4J 绑定。 SLF4J:在 [jar:file:/C:/Users/rm694/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.3/
Spring Batch - 在阅读器中将日期字段作为字符串读取并将其转换为其他格式
在发布问题之前,我浏览了许多链接,例如:Using Spring Batch to parse date from file into LocalDateTime and Spring Batch - how to conversion String from file to Date?等等,但是那...
使用java注释的Spring批处理java.lang.IllegalStateException:无法在没有元数据的情况下创建属性
尝试仅在项目中使用java注释将FieldSets自动映射到域对象 失败于以下几点: BeanWrapperFieldSetMapper.mapFieldSet(第 184 行)位于以下行(第 187 行):
我使用以下代码在我的 SpringBoot 应用程序中设置 Spring-Batch @配置 @EnableBatchProcessing 公共类 BatchConfig { 私人最终字符串[]FIELD_NAMES =新...
使用 Spring Batch 中作业 xml 文件配置中步骤的值
我有一个春季批处理作业,我需要在一个步骤中从数据库获取一个值,并在另一个步骤中在读取器中使用该值。但我收到一条错误消息: 'bean 类的无效属性'id'...
在关闭时停止所有 Spring 批处理作业 (CTRL-C)
我有一个 Spring Boot / Spring Batch 应用程序,它启动不同的作业。 当应用程序停止 (CTRL-C) 时,作业将保持运行状态 (STARTED)。 尽管 CTRL-C 给应用程序带来了...
尝试在 Spring Batch ItemProcessor 中读取数据库查询时出现 NullPointerException
公共类TransactionHistoryCsvItemProcessor实现ItemStream,ItemProcessor{ @Autowired 私人 TransactionHistoryRepo...
Spring Batch 和具有单个数据库的多实例 Kubernetes 应用程序
我不完全理解 Spring Batch 在具有多个实例的 Kubernetes 环境中是否可以正常工作。从这个问题我了解到,一般来说它工作得很好,但在答案中它是......