代码之家  ›  专栏  ›  技术社区  ›  alepuzio

springbatch:从第一个select读取数据,读取第二个select,并使用两个select的数据为每个元素创建一个文件

  •  0
  • alepuzio  · 技术社区  · 3 年前

    1. 从a表中读取一些代码(a、B等)
    2. 在多个文件中写入(2)的数据CSV:每个文件的文件名中有1个代码(文件A.CSV有代码A的数据,文件B.CSV有代码B的数据,等等)。

    @Configuration
    public class BatchConfig extends JobConfigurationSupport {
    /***variuos attributes**/
     
     /**
     * JOB QUARTZ
     *
     * @return JobDetailFactoryBean
     */
    @Bean(name = MY_BATCH_JOB+"Quartz")
    public JobDetailFactoryBean myBatchJobQuartz() {
        Map<String, Object> params = new HashMap();
        return QuartzUtils.createJob(MY_BATCH_JOB, params);
    }
    
    
    /**
     *  RUN THE JOB 
     *  */
    @Bean(MY_BATCH_JOB)
    public Job job(
            @Qualifier(MY_BATCH_JOB + ".myReport") Step myReport,
            ) throws IOException {
        return jobs
                .get(MY_BATCH_JOB)
                .incrementer(new RunIdIncrementer())
                .start(myReport)
                .build();
    }
    
    /** 
     * RUNNED BYT THE JOB - NOT StepCode
     *  */
    @Bean(MY_BATCH_JOB + ".myReport")
    public Step myReport(@Qualifier("input") JdbcPagingItemReader<JavaBeanDTO> input,
            @Qualifier(MY_BATCH_JOB + "myProcessor") ItemProcessor<JavaBeanDTO, JavaBeanVisualization> processor,
            @Qualifier(MY_BATCH_JOB + "myWriter") FlatFileItemWriter<JavaBeanVisualization> writer
          ) {
        l
        return steps
                .get(MY_BATCH_JOB + ".myReport")
                .<JavaBeanDTO, JavaBeanVisualization>chunk(200)
                .reader(input)
                .myProcessor(processor)
                .myWriter(writer)
                .build();
    }
    
    
    /******
     * PHASES OF THE JOB
     ***/
    @Bean
    @StepScope
    public JdbcPagingItemReader<JavaBeanDTO> input(DataSource dataSource, PagingQueryProvider queryProvider) {
        /**create the JdbcPagingItemReaderm, but it doesn't accept any params that is not @Component*/
    }
    
    @Bean(name = "myProcessor")
    @StepScope
    public ItemProcessor<JavaBeanDTO, JavaBeanVisualization> processor() {
        /*This is fine, no problem*/
    }
    
    @Bean(name =  "myWriter")
    @StepScope
    public FlatFileItemWriter<JavaBeanVisualization> writer(PersonalComponent personalComponent) {
        /**create the file, but it not accept param that are not @Component
        PersonalComponent is a class of mine and has the @Component Annotation, it's used to calculate the name of the file with some logic*/
    }
    
    
    @Bean
    public SqlPagingQueryProviderFactoryBean queryProvider(DataSource dataSource) {
        /*create the select, but not accept other param
    

    }

    }

    例如:

    请问您有什么参考或解释吗?

    我试图记住属性中的数据 地图 但这是一个通过考试的问题 步进码 ,因为Spring将 @组成部分

    很明显,我不能使用tasklet,因为tasklet不需要任何步骤的串联,并且在这种情况下分区是多余的(我不需要并行执行,但需要顺序执行)

    1. 我可以创建两个公共步骤方法:
    • 第一个运行第一个输入法(第一个查询)并

    但是在第一次查询(第一个输入法)之后,理论上我至少需要一个编写器(Spring Batch必须有一个读写器),但实际上我只需要将结果存储在一个列表中,并将其传递给处理器或编写器(解析列表,我将使用当前代码命名文件名并过滤数据以打印在其上)。

    • 要将它们存储在列表中,
    • 将列表传递给处理器
    • 将当前代码传递给writer方法,

    但是我收到了一个关于Spring中参数生存期的错误 . 你知道我怎样才能解决这个问题吗?

    1. @值(#{jobParameter…) 但是该方法拒绝接受作为参数并在 SqlPagingQueryProviderFactoryBean.SetWhere子句

    我怎样才能解决这个问题?

    提前感谢您的反馈

    PS我知道这个问题很长,可能不是每个细节都很清楚,但是我发现在网上阅读好的文档有些困难。您是否有任何在线参考资料或更好的例子/项目需要学习?我发现官方文件对我的需要有点笼统。

    0 回复  |  直到 3 年前