我正在读取xml文件,收集记录并将其存储在DB中。我的目标是记录文件名,如果在DB中存储此xml的记录时有任何异常。我希望在listner级别执行上下文,我可以获取文件名。但我认为spring批处理没有该功能。
我希望使用partitioner的执行上下文将文件名传递给侦听器。
这个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>
答案 0 :(得分:1)
您需要将CustomItemWriterListener
bean放入步骤范围,以便了解步骤ExecutionContext
。
<!-- note: scope="step" -->
<bean id="CustomItemWriterListener" scope="step"
class="com.listeners.CustomItemWriterListener" >
<property name="filename" value="#{stepExecutionContext['payloadfile']}" />
</bean>