首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Boot + Spring Batch + Spring

Spring Boot + Spring Batch + Spring
EN

Stack Overflow用户
提问于 2018-01-31 17:55:38
回答 2查看 10.8K关注 0票数 2

我正在处理Spring批处理作业,它将数据从Server转移到Cassandra。我使用来读取和写入数据。我为这两个数据库创建了实体和JPA存储库。

现在我不知道如何在Spring中使用我的ItemReader。我在网上搜索过,很少找到他们提到使用JpaPageItemReader的参考资料。但这需要指定查询和配置其他详细信息。但我不知道如何使用我现有的JpaRepository。下面是相关代码的片段-

My JpaRepostory for Server

代码语言:javascript
复制
public interface ScanJpaRepository extends JpaRepository<Scan, Integer> 
{

   @Transactional(readOnly = true)
   @Query("select s from Scan s left join fetch s.projectVersion")
   Stream<Scan> findAllScan();
}

我的春季批作业-

代码语言:javascript
复制
@Configuration
@EnableBatchProcessing
public class SSCBatchConfigurationCassandra {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;


    @Bean
    public PlatformTransactionManager transactionManager() {
        return new ResourcelessTransactionManager();
    }


    @Bean
    public JobExplorer jobExplorer() throws Exception {
        MapJobExplorerFactoryBean jobExplorerFactory = new MapJobExplorerFactoryBean(mapJobRepositoryFactoryBean());
        jobExplorerFactory.afterPropertiesSet();
        return jobExplorerFactory.getObject();
    }

    @Bean
    public MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean() {
        MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean();
        mapJobRepositoryFactoryBean.setTransactionManager(transactionManager());
        return mapJobRepositoryFactoryBean;
    }

    @Bean
    public JobRepository jobRepository() throws Exception {
        return mapJobRepositoryFactoryBean().getObject();
    }

    @Bean
    public JobLauncher jobLauncher() throws Exception {
        SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
        simpleJobLauncher.setJobRepository(jobRepository());
        return simpleJobLauncher;
    }


    @Bean
    public ItemReader<Project> reader() {
         **// how to read from ScanJpaRepository ??**
    }

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

    @Bean
    public ItemWriter<CassandraProject> cqlWriter() {
         final CassandraBatchItemWriter writer = new CassandraBatchItemWriter();
         return writer;
    }



    // tag::jobstep[]
    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(step1)
                .end()
                .build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .<Project, CassandraProject> chunk(100)
                .reader(reader())
                .processor(processor())
                .writer()
                .build();
    }


    // end::jobstep[]
}

更新1:如前所述,我将项目读取器添加到批次作业中。

代码语言:javascript
复制
@Configuration
@EnableBatchProcessing
public class FortifySSCBatchConfigurationCassandra {
   ....
   @Autowired
   public ScanItemReader itemReader;
   .....

   @Bean
   public Step step1() {
    return stepBuilderFactory.get("step1")
            .<Scan, CScan> chunk(100)
            .reader(itemReader)
            .processor(processor())
            .writer(cqlWriter())
            .build();
     }


}

我的IDE抱怨这个-

代码语言:javascript
复制
The method reader(ItemReader<? extends Scan>) in the type SimpleStepBuilder<Scan,CScan> is not applicable for the arguments (ScanItemReader)

更新2:

代码语言:javascript
复制
public class CassandraItemProcessor implements ItemProcessor<Scan, CScan> {


    @Override
    public CScan process(Scan s) throws Exception {


        .. 

        return new CScan();
    }

}


public class CassandraBatchItemWriter implements ItemWriter<CScan> {




    @Override
    public void write(List<? extends CScan> arg0) throws Exception {
        // TODO Auto-generated method stub

    }


}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-31 18:07:03

你可以这样声明你的阅读器

代码语言:javascript
复制
@Component
@JobScope
public class ScanItemReader extends RepositoryItemReader<Scan> {

  private final ScanJpaRepository repository;

  @Autowired
  public ScanItemReader(final ScanJpaRepository repository) {
    super();
    this.repository = repository;
  }

  @PostConstruct
  protected void init() {
    final Map<String, Sort.Direction> sorts = new HashMap<>();
    sorts.put("Your sort parameter"), Direction.ASC);// This could be any field name of your Entity class
    this.setRepository(this.repository);
    this.setSort(sorts);
    this.setMethodName(""); // You should sepcify the method which  
               //spring batch should call in your repository to fetch 
               // data and the arguments it needs needs to be  
               //specified with the below method.  
               // And this method  must return Page<T>
    this.setArguments();
  }
}

自动读取这个读取器bean并在您的StepBuilder中使用它。

票数 2
EN

Stack Overflow用户

发布于 2018-02-27 15:59:34

我也想做同样的事,但却被塞了下来。如果它对您有用,请共享git存储库或任何其他参考。我想看看我们如何从一个数据库读取另一个数据库。我已经有JPA方法了。我只想自动使用它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48548547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档