我是Spring批处理的新手,我想找到使用用例的完美方法,如下所示:
我有多个csv文件,我想把它们存储在内存(作为集合存储...即列表地图),然后我想在我的逻辑业务的下一步/作业中使用/引用它们。
让我们举一个例子,一个对象XX和一个ItemWriter一起存储在地图上。
对象XX模型
public class Object {
private int x;
private int y;
// getters setters
}
对象X的itemReader
public class ObjectItemReader extends FlatFileItemReader<Object> {
public ObjectItemReader() {
this.setResource(new ClassPathResource("xxx.csv"));
this.setLineMapper(new DefaultLineMapper<Object>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[] { "x", "y" });
setDelimiter(DELIMITER_TAB);
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Object>() {{
setTargetType(Object.class);
}});
}});
}
}
目标作者
public class ObjectItemWriter implements ItemWriter<Object> {
private Map<Long , Object> objectMap;
public ObjectItemWriter() {
System.out.println("Map Store is created ");
objectMap= new HashMap<Long , Object>();
}
@Override
public void write(List<? extends Object> items) throws Exception {
for (Object depot : items) {
objectMap.put(depot.getX(), depot);
}
}
public Map<Long , Object> getobjectMap() {
return objectMap;
}
}
正如你可以看到所有的记录都存储在地图与itemWriter,我做了一个测试与一个简单的任务,以访问这个地图在其他步骤
public class TaskletStep implements Tasklet{
@Autowired
private ObjectItemWriter objectItemWriter;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println(objectItemWriter.getobjectMap().size());
return null;
}
}
我的问题,
是否有另一种方法/最佳方法将所有csv文件存储在内存中,只使用ItemReader或ItemProcessor,因为这是一种简单的从文件中获取数据以进行映射的方法?
项目编写器是将这些文件存储在地图上的重要步骤吗?
在Spring Batch面向块的步骤中,定义读取器
然后你可以选择做任何事情——在组件中什么都不做,并且可以在组件中做任何你想做的事情,而不考虑组件的名称(作为读卡器、处理器或编写器)。
话虽如此,您还没有指定为什么要在阅读器或处理器中填充地图
在我看来,如果您选择了Spring Batch,那么您必须按照预定义和假定的流来设计程序,以获得干净的代码和干净的设计。从这个角度来看,你目前的方法看起来比你计划的要好。
是否有另一种方法/最佳方法将所有csv文件存储在内存中,只使用ItemReader或ItemProcessor,因为这是一种简单的从文件中获取数据以进行映射的方法?
如前所述,您可以在processor中填充map,并拥有一个不执行任何操作的writer。您必须注意,分块无论如何都会发生,控制权将交给writer来提交事务。在我看来,如果你不想在写之前转换一个已读项目,只需省略处理器,直接将项目从读卡器发送到写卡器(分块)。
通过在reader中填充map,您将违反单一责任原则(SRP),这是不可取的。
项目编写器是将这些文件存储在地图上的重要步骤吗?
只要您相信解耦组件和SRP,这是至关重要的。
如果一个组件可以完成工作,为什么有人需要三个组件?你们的问题让我不禁要问,为什么我们甚至需要Spring批处理API/框架(只需要使用-FlatFileItemReader
class?)?
希望有帮助!!
问题内容: 我知道,在Maven时代,不建议将库存储在VCS中,但是有时候这样做很有意义。 我的问题是如何最好地存储它们- 压缩还是未压缩?未压缩的文件较大,但是如果用较新的文件替换几次,则两个未压缩的.jar文件之间存储的差异可能比压缩后的差异小得多。有人做过测试吗? 问题答案: 在VCS中存储.jar文件的最佳实践(SVN,Git等):请勿。 在像SVN这样的CVCS(集中式VCS)中,它可以
ReactJS新手问题。我正在利用材料UI自动完成谷歌Places API,使用户能够查找位置。除了位置,我还从Google Places API返回了一个“place_id”。问题是,我不清楚存储“place_id”以便在ReactJS中提交最终表单的最佳实践。通常,我只会将它存储到一个隐藏的字段中,但我想知道在ReactJS中这样做的最佳实践是什么?您可以看到我的演示项目https://cod
问题内容: 我需要做的是存储一对一的映射。数据集包含大量相同类型的键值对(10M +)。例如,可以使用Java中的HashMap对象的单个实例来存储此类数据。 第一种方法是存储许多键值对,如下所示: 第二种选择是使用单个“哈希”: Redis的哈希有一些方便的命令(,,等),他们不污染密钥空间,所以这看起来像一个更好的选择。但是,使用此方法时是否有任何性能或内存方面的考虑? 问题答案: 是的,正如
我使用了3种不同的代码来测试上传到Firebase存储的图像文件的大小。(图像的原始大小为12.3 MB) 第一个代码将uri转换为位图,并将其放在ImageView上,将其压缩为PNG格式,最后将图像上传到Firebase存储。 上载的格式:。巴布亚新几内亚。上传后的大小:14.82 MB。 第二个代码与第一个代码相同,但将其转换为JPEG。 上传格式。JPEG。上传后的大小5.58 MB。 第
目前,我正在尝试将一个文件上载到AmazonS3存储桶,我对此进行了一些研究,发现如果文件足够大,类TransferManager会将文件拆分为小块,然后使用多个线程并行上载。现在在应用程序中,我们正在创建一个AmazonS3客户端实例(在应用程序开始时创建的一个bean),并使用该AmazonS3客户端为用户上传文件所需的每个文件创建TransferManager类实例,文件上传完成后(由Tra
问题内容: 我正在开发一个J2ME应用程序,该应用程序具有要存储在设备上的大量数据(大约1MB,但是可变)。我不能依靠文件系统,所以我卡住了记录管理系统(RMS),该系统允许多个记录存储,但每个记录存储空间都有限。我最初的目标平台Blackberry将每个限制为64KB。 我想知道是否还有其他人必须解决在RMS中存储大量数据的问题,以及他们如何进行管理?我正在考虑必须计算记录大小并在多个存储区中拆