问题描述
我需要从数据库中获取数据,然后根据数据库中给定的文件名将该数据写入文件.
I have a requirement to get the data from a database and write that data to files based on the filename given in the database.
这是在数据库中定义数据的方式:
This is how data is defined in the database:
Columns --> FILE_NAME, REC_ID, NAME
Data --> file_1.csv, 1, ABC
Data --> file_1.csv, 2, BCD
Data --> file_1.csv, 3, DEF
Data --> file_2.csv, 4, FGH
Data --> file_2.csv, 5, DEF
Data --> file_3.csv, 6, FGH
Data --> file_3.csv, 7, DEF
Data --> file_4.csv, 8, FGH
如您所见,基本上文件名和数据都是在数据库中定义的,因此SpringBatch应该做的就是获取此数据并将其写入数据库中指定的相应文件中(即file_1.csv
仅应包含3个记录(1,2,3),file_2.csv
仅应包含记录4和5,依此类推)
As you see, basically the file names along with the data is defined in the Database so what SpringBatch should do is get this data and write it to the corresponding file specified in the Database (i.e., file_1.csv
should only contain 3 records (1,2,3), file_2.csv
should only contain records 4 and 5, etc.)
是否可以将MultiResourceItemWriter
用于此要求(请注意,整个文件名是动态的,需要从数据库中检索).
Is it possible to use MultiResourceItemWriter
for this requirement (please note that entire file name is dynamic and needs to be retrieved from Database).
推荐答案
我不确定,但我不认为有一种简单的方法来获取它.您可以尝试像这样构建自己的ItemWriter:
I'm not sure but I don't think there is an easy way of obtaining this. You could try to build your own ItemWriter like this:
public class DynamicItemWriter implements ItemStream, ItemWriter<YourEntry> {
private Map<String, FlatFileItemWriter<YourEntry>> writers = new HashMap<>();
private LineAggregator<YourEntry> lineAggregator;
private ExecutionContext executionContext;
@Override
public void open(ExecutionContext executionContext) throws ItemStreamException {
this.executionContext = executionContext;
}
@Override
public void update(ExecutionContext executionContext) throws ItemStreamException {
}
@Override
public void close() throws ItemStreamException {
for(FlatFileItemWriter f:writers.values()){
f.close();
}
}
@Override
public void write(List<? extends YourEntry> items) throws Exception {
for (YourEntry item : items) {
FlatFileItemWriter<YourEntry> ffiw = getFlatFileItemWriter(item);
ffiw.write(Arrays.asList(item));
}
}
public LineAggregator<YourEntry> getLineAggregator() {
return lineAggregator;
}
public void setLineAggregator(LineAggregator<YourEntry> lineAggregator) {
this.lineAggregator = lineAggregator;
}
public FlatFileItemWriter<YourEntry> getFlatFileItemWriter(YourEntry item) {
String key = item.FileName();
FlatFileItemWriter<YourEntry> rr = writers.get(key);
if(rr == null){
rr = new FlatFileItemWriter<>();
rr.setLineAggregator(lineAggregator);
try {
UrlResource resource = new UrlResource("file:"+key);
rr.setResource(resource);
rr.open(executionContext);
} catch (MalformedURLException e) {
e.printStackTrace();
}
writers.put(key, rr);
//rr.afterPropertiesSet();
}
return rr;
}
}
并将其配置为编写器:
<bean id="csvWriter" class="com....DynamicItemWriter">
<property name="lineAggregator">
<bean
class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<property name="delimiter" value=","/>
<property name="fieldExtractor" ref="csvFieldExtractor"/>
</bean>
</property>
这篇关于Spring Batch:使用动态文件名将数据写入多个文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!