Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程执行器没有';t工作弹簧批_Java_Multithreading_Spring Batch - Fatal编程技术网

Java 线程执行器没有';t工作弹簧批

Java 线程执行器没有';t工作弹簧批,java,multithreading,spring-batch,Java,Multithreading,Spring Batch,我有一个持续9分钟的治疗,我想通过使用线程执行器来减少执行时间 我的读卡器读取数据库中的1200行,并生成一个UNPIVOT,该UNPIVOT为我提供56036行写入csv文件 我尝试了几种方法,但没有时间上的差异,我的印象是没有考虑配置 @Bean @StepScope public ItemReader<DmNebefPdhExportRetenuCSV> datamartEffRetenuItemReader( @Value("#{jobParameters['

我有一个持续9分钟的治疗,我想通过使用线程执行器来减少执行时间

我的读卡器读取数据库中的1200行,并生成一个UNPIVOT,该UNPIVOT为我提供56036行写入csv文件

我尝试了几种方法,但没有时间上的差异,我的印象是没有考虑配置

@Bean
@StepScope
public ItemReader<DmNebefPdhExportRetenuCSV> datamartEffRetenuItemReader(
        @Value("#{jobParameters['dateExport']}") Date dateExport) throws Exception {
    PagingQueryProvider query = createEffRetenuQuery();
    Map<String, Object> parameters = new HashMap<>();
    parameters.put("dateExport", dateExport);

    JdbcPagingItemReader<DmNebefPdhExportRetenuCSV> reader = new JdbcPagingItemReader<>();
    reader.setDataSource(sdmDataSource);
    reader.setParameterValues(parameters);
    reader.setQueryProvider(query);
    reader.setFetchSize(1000);
    reader.setPageSize(1000);
    reader.setRowMapper(new BeanPropertyRowMapper<>(DmNebefPdhExportRetenuCSV.class));

    return reader;
}

@Bean
@StepScope
FlatFileItemWriter<DmNebefPdhExportRetenuCSV> exportEffRetenuItemWriter(
        @Value("#{jobParameters['dateExport']}") Date dateExport) {
    // Construction du Header
    StringHeaderWriter headerWriter = new StringHeaderWriter(EXPORT_EFF_RETENU_CSV_HEADER);

    String newExportFileVersion = getExportRetenuVersion(dateExport);

    // Nom du fichier d'export
    String csvFileName = createEffRetenuExportFileName(dateExport, newExportFileVersion);

    // Chemin complet d'enregistrement du fichier
    String exportFilePath = String.join("/", exportArchiveCreRetenuPath, csvFileName);

    // Définition du délimiteur et des champs à mapper
    LineAggregator<DmNebefPdhExportRetenuCSV> lineAggregator = effRetenuLineAggregator();

    // Put dans le context pour récupérer dans le listener
    exportEffRetenuJobListener.getJobExecution().getExecutionContext().put("exportFilePath", exportFilePath);
    exportEffRetenuJobListener.getJobExecution().getExecutionContext().put("csvFileName", csvFileName);
    exportEffRetenuJobListener.getJobExecution().getExecutionContext().put("newExportFileVersion",
            newExportFileVersion);

    FlatFileItemWriter<DmNebefPdhExportRetenuCSV> csvFileWriter = new FlatFileItemWriter<>();
    csvFileWriter.setShouldDeleteIfEmpty(true);
    csvFileWriter.setHeaderCallback(headerWriter);
    csvFileWriter.setResource(new FileSystemResource(exportFilePath));
    csvFileWriter.setLineAggregator(lineAggregator);

    return csvFileWriter;

}

@Bean
public Step exportCSVStep() throws Exception {
    return stepBuilderFactory.get("exportCSVStep")
            .<DmNebefPdhExportRetenuCSV, DmNebefPdhExportRetenuCSV>chunk(100)
            .reader(datamartEffRetenuItemReader(WILL_BE_INJECTED))
            .listener(readListener)
            .writer(exportEffRetenuItemWriter(WILL_BE_INJECTED))
            .listener(writeListener)
            .taskExecutor(taskExecutor())
            .throttleLimit(50)
            .build();
}

@Bean
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor ();
    taskExecutor.setMaxPoolSize(50);
    taskExecutor.afterPropertiesSet();
    return taskExecutor;
}

@Bean
public Job exportEffRetenuJob() throws Exception {
    return jobBuilderFactory
            .get("exportEffRetenuJob")
            .incrementer(new RunIdIncrementer())
            .listener(exportEffRetenuJobListener)
            .flow(exportCSVStep()).end().build();
}
使用TaskExecutor时:11328秒

[2018-01-03 11:42:55,439] INFO  ExportEffRetenuJobListener - Start job exportEffRetenuJob - export month 04-2017 
[2018-01-03 11:43:06,767] INFO  ExportEffRetenuJobListener - End job : exportEffRetenuJob - export month : 04-2017 - statut : COMPLETED
使用240 000行进行读/写测试

使用TaskExecutor时:123秒

无TaskExecutor时:127秒


我认为我没有很好地配置任务执行器。

您必须为执行器设置一个
corePoolSize
。默认值为1,因此仍然只能得到一个线程。尝试设置taskExecutor.setCorePoolSize(50),然后重新运行作业。

我遇到了类似的问题。运行批处理时,日志语句仅提及
taskExecutor-1
,即仅创建了一个线程。我更新了我的
TaskExecutor
bean,如下所示,解决了我的问题

@Bean
        public TaskExecutor taskExecutor() {
            ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
            taskExecutor.setMaxPoolSize(4);
            taskExecutor.afterPropertiesSet();
        taskExecutor.setCorePoolSize(20);
            taskExecutor.setQueueCapacity(8)

            return taskExecutor;
        }   
看看您的用例,如果处理不是主要瓶颈,那么我认为分区将是这种情况下最好的扩展选项。

添加此参数不会改变任何事情,但我的问题是,我没有在阅读器中设置pageSize和fetchSize。初始化这两个值后,治疗时间从9分钟缩短到10秒。但无论是否设置poolSize,它都不会改变任何东西,我也不知道为什么。根据您所说的,我猜瓶颈不是在阅读端,而是在写作端。从数据库中读取1200行应该不是问题。我们可以看看您的编写器吗?我添加了它,我放弃了使用任务执行器,因为csv文件中不再遵守我请求的顺序。但我对理解任务执行器的配置很感兴趣。它不会改变任何东西,请看我下面的评论是的,我只是添加了它。(非常短)可能由于数据量的原因,增益很小,我正在用更多的数据运行更多的测试。使用24万行进行读/写更新,您是否有其他想法来配置task executor,或者它对您正常工作?
@Bean
        public TaskExecutor taskExecutor() {
            ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
            taskExecutor.setMaxPoolSize(4);
            taskExecutor.afterPropertiesSet();
        taskExecutor.setCorePoolSize(20);
            taskExecutor.setQueueCapacity(8)

            return taskExecutor;
        }