【发布时间】:2017-06-05 05:01:00
【问题描述】:
我正在读取 xml 文件,收集记录并将其存储在 DB 中。我的目标是在将这个 xml 的记录存储在 DB 中时记录文件名。我希望在侦听器级别的执行上下文中可以获取文件名。但我认为 Spring Batch 没有该功能。
我希望使用分区程序的执行上下文将文件名传递给侦听器。
这个partitinor我们给executioncontext发送文件名有字符串到项目写入监听器。
public class MultiFileResourcePartitioner implements Partitioner {
private String inboundDir;
@Override
public Map<String, ExecutionContext> partition(int gridSize) {
Map<String, ExecutionContext> partitionMap = new HashMap<String, ExecutionContext>();
File payloadFileDir = new File(inboundDir);
if (payloadFileDir.isDirectory()) {
File[] payloadFiles = payloadFileDir.listFiles();
for (File payloadFile : payloadFiles) {
ExecutionContext context = new ExecutionContext();
context.putString("name", "Thread" +payloadFile.getName());
context.putString("payloadfile", payloadFile.getName());
context.put("fileResource", payloadFile.toURI().toString());
partitionMap.put(payloadFile.getName(), context);
}
}
//System.out.println("partitionMap::"+partitionMap.size());
return partitionMap;
}
public String getInboundDir() {
return inboundDir;
}
public void setInboundDir(String inboundDir) {
this.inboundDir = inboundDir;
}
}
这是项侦听器类,它的文件名具有字符串数据类型,它将从步骤执行上下文中获取文件名。
public class CustomItemWriterListener implements ItemWriteListener<ItemMaintenance> {
private String filename;
Logger logger = Logger.getLogger("MyLog");
FileHandler fh;
@Override
public void beforeWrite(List<? extends ItemMaintenance> items) {
System.out.println("ItemWriteListener - beforeWrite");
}
@Override
public void afterWrite(List<? extends ItemMaintenance> items) {
System.out.println("ItemWriteListener - afterWrite:"+items.size());
}
@Override
public void onWriteError(Exception exception, List<? extends ItemMaintenance> items) {
try {
fh = new FileHandler("D:/temp/ErrorWriter.txt");
logger.addHandler(fh);
SimpleFormatter formatter = new SimpleFormatter();
fh.setFormatter(formatter);
logger.info("duplicate record"+"::"+exception.getMessage().subSequence(450, 453)+filename);
}
catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
此 bean 将从步骤执行上下文中获取文件名。
<bean id="CustomItemWriterListener"
class="com.listeners.CustomItemWriterListener">
<property name="filename" value="#{stepExecutionContext['payloadfile']}" />
</bean>
【问题讨论】:
-
您应该与我们分享您尝试过的代码。无论如何,通过查看您的问题,我希望以下链接可以帮助您。stackoverflow.com/questions/29118156/…
标签: java spring-batch