java - Spring Batch,作者中的更新语句?抛出 IllegalArgumentException

标签 java spring spring-boot spring-batch

尽可能简洁,

我有一个主步骤,可以将执行分为并行的从属步骤。

这些从属设备都有自己的上下文,其中存储它们执行的线程的 ID,runNumber。它们是读取器、处理器、写入器步骤。我关心的是这个奴隶的写作。我有一个 CompositeItemWriter,它有一个编写器,我想要执行一条 SQL 更新语句来更新数据库中线程的成功。作者如下:

@Bean
@StepScope
public JdbcBatchItemWriter<TraceDataDto> controlSuccessWriter(
        @Value("#{jobExecutionContext['runNumber']}") int runNumber,
        @Qualifier("veDataSource") DataSource veDataSource) {
    JdbcBatchItemWriter<TraceDataDto> mysqlWriter = new JdbcBatchItemWriter<>();

    mysqlWriter.setDataSource(veDataSource);

    String sql = "UPDATE control SET status=1 WHERE run_number=" + runNumber;

    mysqlWriter.setSql(sql);

    return mysqlWriter;
}

现在,我遇到了麻烦,因为它抛出了一个错误:

java.lang.IllegalArgumentException: Using SQL statement with '?' placeholders requires an ItemPreparedStatementSetter

现在我知道有一条路径可以创建一个实现 ItemPreparedStatementSetter 的自定义类,但我担心这会通过将单个值映射到对象来产生不必要的开销。

有没有一种简单的方法可以将这个更新语句作为从属步骤的一部分执行?

最佳答案

Spring Batch 提供的 ItemWriter 实现预计会持久保存项目。这不是您想要做的,所以我建议创建一个 ItemWriter (或者更好的监听器),它只使用 JdbcTemplate 来执行您需要的查询。

关于java - Spring Batch,作者中的更新语句?抛出 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50683092/

相关文章:

java - 是否可以覆盖 Glassfish v3 的默认日志记录?

spring - 当我从 Spring 1.5.21 升级到 2.1.5 时,pom.xml 中出现 "unknown"错误

spring-boot:自动配置事务管理器

rest - Camel Rest DSL 检索 HTTP POST 多部分文件

java - Azure 应用程序服务为 Spring Boot 应用程序提供 404

java - Java 中的全局异常处理程序

java - 将当前选择的付款信息存储在客户类别中

Spring JMS : each DefaultMessageListenerContainer deployment takes longer than one before

java - spring-boot 在多模块应用程序上失败

java - 嵌套字段的 Comparator.comparing(...)