【发布时间】:2021-08-20 01:53:56
【问题描述】:
我正在使用 springbatch 使用 MongoItemReader bean 从 mongo db 读取数据。假设我想从同一个作业实例中的 2 个不同集合中读取数据。这可能吗?
@Bean
@StepScope
public MongoItemReader<Object> reader() throws UnexpectedInputException, ParseException, Exception {
DataReader dataReader = new DataReader();
return dataReader.read();
}
@Bean
public DataItemProcessor processor() {
return new DataItemProcessor();
}
@Bean
public MongoItemWriter<DestinationCollectionModelClass> writer() {
MongoItemWriter<DestinationCollectionModelClass> writer = new MongoItemWriter<>();
writer.setCollection("collection_name_where_data_is_saved");
writer.setTemplate(mongoTemplate);
return writer;
}
@Bean
public Step step1(MongoItemWriter<DestinationModelClass> writer) throws UnexpectedInputException, ParseException, Exception {
return stepBuilderFactory.get("step1")
// TODO: P3 chunk size configurable
.<Object, DestinationModelClass>chunk(100)
.reader(dataReader())
.processor(processor())
.writer(writer())
.build();
}
下面是我的类DataReader.java
公共类 DataReader 扩展 MongoItemReader {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public MongoItemReader<Object> read() throws Exception, UnexpectedInputException, ParseException {
List<Object> mongoItemReaderList = new ArrayList<>();
Map<String, Direction> sorts = new HashMap<>();
sorts.put("_id", Direction.ASC);
MongoItemReader<Object> collectionOneReader = new MongoItemReader<>();
collectionOneReader.setTemplate(mongoTemplate);
collectionOneReader.setTargetType(CollectionOneModelClass.class);
collectionOneReader.setQuery("{}");
collectionOneReader.setSort(sorts);
MongoItemReader<Object> collectionTwoReader = new MongoItemReader<>();
collectionTwoReader.setTemplate(mongoTemplate);
collectionTwoReader.setTargetType(CollectionTwoModelClass.class);
collectionTwoReader.setQuery("{}");
collectionTwoReader.setSort(sorts);
mongoItemReaderList.add(collectionOneReader);
mongoItemReaderList.add(collectionTwoReader);
MongoItemReader<Object> readerObject = (MongoItemReader<Object>) mongoItemReaderList;
return readerObject;
}
}
下面是我的 DataItemProcessor.java
公共类 DataItemProcessor 实现 ItemProcessor
public DataItemProcessor() {}
@Override
public DestinationModelClass process(Object phi) throws Exception {
DestinationModelClass hbd = new DestinationModelClass();
if(phi instanceof CollectionOneModelClass) {
//Processing code if Object is an instance of CollectionOneModelClass
}
if(phi instanceof CollectionTwoModelClass) {
//Processing code if Object is an instance of CollectionTwoModelClass
}
return hbd;
}
}
【问题讨论】:
-
没有 Spring Batch你会怎么做?请为此分享您的代码。您是否打算“加入”两个系列?在这种情况下你会如何定义一个项目?
-
我不想加入集合。在我的处理器中,我将使用 collection1 的一些属性和 collection2 的一些属性并保存在第三个集合中。我正在编辑我的问题并添加我的代码 sn-p
-
请先用一个例子解释您的问题,然后再分享您尝试的解决方案。
-
问题是我需要从 2 个不同的集合中读取数据并处理它们,并使用两个集合中的一些数据并将其保存在第三个集合中
标签: mongodb spring-boot spring-batch