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

块大小为n的Spring批处理作业,只写入第n行n次

祁建明
2023-03-14

在此批处理配置中,我在何处/如何创建TEstLayout的新实例?

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    @Qualifier("callTestStep")
    public Step callTestStep(StepBuilderFactory stepBuilders) {
        return stepBuilders.get("callTestStep").tasklet(callTEstPgmTasklet()).build();
    }

    @Bean
    public CallTEstPgm callTEstPgmTasklet() {
        return new CallTEstPgm();
    }

    @Bean
    @Qualifier("clearOutFileStep")
    public Step clearOutFileStep(StepBuilderFactory stepBuilders) {
        return stepBuilders.get("clearOutFile").tasklet(clearOutFileTasklet()).build();
    }

    @Bean
    public ClearOutFile clearOutFileTasklet() {
        return new ClearOutFile();
    }

    // tag::readerwriterprocessor[]
    @Bean
    @Scope("prototype")
    JdbcCollectiveItemReader<TEstLayout> reader(DataSource dataSource) {
        JdbcCollectiveItemReader<TEstLayout> databaseReader = new JdbcCollectiveItemReader<>();
        databaseReader.setDataSource(dataSource);

        databaseReader
                .setSql(“select * from F33416BA order by x_id”)
);

        databaseReader.setRowMapper(new TEstMultitoOneRowMapper());
        return databaseReader;
    }

    @Bean
    public TEstProcessor processor() {
        return new TEstProcessor();
    }

    @Bean
    public JdbcBatchItemWriter<TestBalanceDetailLayout> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<TestBalanceDetailLayout>()
                .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
                .sql("INSERT INTO " + outFileLib.trim() + "/" + outFile.trim() + " Values (:wholeDetailString)")
                .dataSource(dataSource).build();
    }

    @Bean
    public Job BalanceSummary(JobCompletionNotificationListener listener, @Qualifier("callTestStep") Step callTestStep,
            @Qualifier("clearOutFileStep") Step clearOutFileStep,
            /* Step writeHeader, */ @Qualifier("writeDetailStep") Step writeDetailStep /* , Step writeFooter */) {
        return jobBuilderFactory.get("Balance_Summary_File").incrementer(new RunIdIncrementer()).listener(listener)
                .start(callTestStep).next(clearOutFileStep)
                // .next(writeHeader)
                .next(writeDetailStep)
                // .next(writeFooter)
                .build();
    }

    @Bean
    @Qualifier("writeDetailStep")
    public Step writeDetailStep(JdbcBatchItemWriter<TestBalanceDetailLayout> writer,
            JdbcCollectiveItemReader<TEstLayout> reader, TEstProcessor processor) {
        return stepBuilderFactory.get("writeDetail").<TEstLayout, TestBalanceDetailLayout>chunk(chunkSize)
                .reader(reader).processor(processor).writer(writer).build();
    }
}

共有1个答案

松旭
2023-03-14

这不是春豆的问题!是我的错。块处理一直将数据添加到数组列表中,直到达到块大小。在我的processor类中,我在process方法之外创建了output实例。所以在添加到arraylist的同时,它不断替换整个arraylist。

这就是我的块处理器发生的事情。在添加新元素时,ArrayList的所有元素都会发生变化?

我的处理器之前

  public class TestProcessor implements ItemProcessor<TestLayout, TestBalanceDetailLayout> {
                TestBalanceDetailLayout transformedDetail = new TestDetailLayout();
                @Override
            public TestBalanceDetailLayout process(final TestLayout testLayout) throws Exception {  processor code }
      public class TestProcessor implements ItemProcessor<TestLayout, TestBalanceDetailLayout> {

                @Override
            public TestBalanceDetailLayout process(final TestLayout testLayout) throws Exception {
                TestBalanceDetailLayout transformedDetail = new TestDetailLayout();
processor code }
 类似资料:
  • 我有“N”没有的。客户/客户。对于每个客户/客户,我需要从数据库(读取器)中获取记录,然后我必须处理(处理器)客户/客户的所有记录,然后我必须将记录写入文件(写入器)。 如何将spring批处理作业循环N次?

  • 我有一个家庭作业,要求我用用户输入生成一个n×n矩阵。我试过几种解决办法,但似乎都不管用。我想对你们中的许多人来说,这是一个相对简单的任务。 这是分配文本:编写一个方法,使用以下签名显示一个n×n矩阵:public static void printMatrix(int n)每个元素都是0或1,这是随机生成的。编写一个测试程序,提示用户输入n,并显示n×n矩阵。 我最近的尝试如下(显然我还没有调用

  • 如何才能从pandas数据帧中只写入前N行或从P行到Q行到csv而不首先对df进行子化?由于内存问题,我无法对要导出的数据进行子集。 我正在考虑一个函数,它逐行写入csv。 谢谢你

  • 问题内容: java.util.Random源代码的第294行说 为什么是这样? 问题答案: 该描述并不完全准确,因为0不是2的幂。更好的说法是 当n是2的幂或2的幂的负数或零时。 如果n是2的幂,则二进制中的n是单个1,后跟零。-n为2的补数是倒数+ 1,因此位排成一行 要了解其工作原理,请将二进制补码视为逆+ 1。 因为当您添加一个得到两个的补码时,您会一直进行到一个。 如果n不是2的幂,则结

  • 问题内容: 在Java中,表达式为: 似乎等于: 尽管是有效的一元运算符,其优先级高于中的算术运算符。因此,编译器似乎假设该运算符不能为一元运算符,并解析该表达式。 但是,表达式: 即使存在以下唯一有效的解决方案,也不会编译: 和被指定为具有相同的优先级,那么为什么编译器为支持算术而解决看似模棱两可的问题,但为什么不这样做呢? 问题答案: 首先使用最大修改规则将文件标记化(转换为标记序列)-始终获

  • 问题内容: 我正在尝试从文本文件读取特定行,但是我不想将文件加载到内存中(它可能会变得很大)。 我一直在寻找,但是我发现的每个示例都要求读取每一行(这将使我的代码变慢,因为有超过100,000行)或将整个内容加载到数组中并获取正确的元素(文件将包含很多行)输入)。 我想做的一个例子: “代码不是实际的代码,它是为了显示我想要的原理而组成的” 有没有办法做到这一点? - - -编辑 - - - 我刚