当前位置: 首页 > 知识库问答 >
问题:

Spring批处理通配符ItemWriter

袁宜民
2023-03-14

我有一个假问题。为了解释我的用例,我有不同类型的DAO;比如说啤酒。。。等等,我想用一个通用的ItemWriter来处理所有的问题。我创建了一个CommonComponentConfiguration,在这里我定义了;

@Bean
@Qualifier(WRITER_INSERT_TO_DATABASE_BEAN)
public ItemWriter<?> insertDbItemWriter(@Qualifier(DATA_SOURCE) DataSource dataSource,
                                        @Qualifier("insertSql") String insertSql) {
         return new MyItemWriter<>(dataSource, insertSql);
     }

作家班是这样的;

@Slf4j
public class MyItemWriter<T> extends JdbcBatchItemWriter<T> {

    public MyItemWriter(DataSource dataSource, String sql) {
        this.setDataSource(dataSource);
        this.setSql(sql);
        this.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        this.setAssertUpdates(false);
    }

    @Override
    public void write(List<? extends T> items) {
        try {
            super.write(items);
        } catch (Exception e) {
            log.error("Could not write the items " + items);
            log.error(e.getMessage());
        }
    }
}

到目前为止一切都还好。事情变得复杂的地方是,我为每个存储库定义了单独的配置类,其中定义了存储库特定的项。例如,为用户插入数据库的步骤。

@Bean
@Qualifier(STEP_INSERT_TO_DB_BEAN)
public Step insertToDbStep(@Qualifier(READER_LOADED_INPUT_DATA_BEAN) ListItemReader<User> sourceItemReader, UserInsertProcessor userInsertProcessor, @Qualifier(WRITER_INSERT_TO_DATABASE_BEAN)
        ItemWriter<User> dbItemWriter) {
    return stepBuilderFactory.get("processInsertStep").<User, User>chunk(100)
            .reader(sourceItemReader)
            .processor(userInsertProcessor)
            .writer(dbItemWriter)
            .build();
}

当我用IJ编写这段代码时,我抱怨无法自动连线。合格bean必须是“ItemWriter”

你可能会说,如果有用的话,不要碰它。不过我真的很想知道幕后发生了什么。

此外,如果你发现设计中的缺陷(例如试图使用一个共同的东西来做所有的事情),你的建议是非常受欢迎的。

提前谢谢你。

PS:看到下面这条线,看起来非常相似——如果不是相同的话——情况。然而,我想知道这里是否与泛型有关。IntelliJ IDEA在使用Spring的@Autowired注释时显示错误


共有1个答案

凌永逸
2023-03-14

不过我真的很想知道幕后发生了什么。

对于这个IntelliJ IDEA警告,您是对的,它与IntelliJ IDEA中讨论的问题相同,在使用Spring的@Autowmed注释时显示错误(尤金在评论中也解释了这一点)

此外,如果你发现设计中的缺陷(例如试图使用一个共同的东西来做所有的事情),你的建议是非常受欢迎的。

如果当前的方法适合你,你可以使用它。然而,我建议你做一件事,做一件事,并把它做好。在您的情况下,这将为每种域类型使用一个条目编写器,并将这些编写器包装在ClassifierCompositeItemWriter中。复合编写器使用分类器对项目进行分类,并相应地调用相应的编写器。

 类似资料:
  • 我们正在处理一个Spring批处理项目(Spring Boot1.2.2.Release),要求使用Spring SFTP集成以一定频率轮询从服务器位置读取文件。我们使用java config实现了Spring批处理,并在使用Spring Integration java config的过程中实现了Spring批处理。我找不到描述上述情况的例子。我浏览了各种链接,但看到的主要是XML配置示例。 h

  • 我有下一个spring批处理配置类: 启动应用程序时,我收到下一个异常:

  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 这是我第一次使用Spring批处理,我有一个例外: 我不知道如何解决这个错误。我使用Java配置来定义作业、步骤、读取器、处理器和写入器: null

  • 当我使用Spring批处理管理运行长时间运行的批处理作业的多个实例时,它会在达到jobLauncher线程池任务执行程序池大小后阻止其他作业运行。但是从cron中提取多个工作似乎效果不错。下面是作业启动器配置。 Spring批处理管理员Restful API是否使用不同于xml配置中指定的作业启动器?

  • 我对Spring批处理跳过逻辑有一些问题。我已经配置了一个作业的步骤来跳过两个异常(SQLIntegrityConstraintViolation异常和乐观锁定失败异常): 但当作业运行时,由于我将其配置为跳过的异常,作业以未知状态完成: 我做错什么了吗?我希望这一步跳过负责抛出其中一个异常的项,并继续处理,以便以完成状态结束。