如何使用执行上下文将文件名发送到侦听器?

时间:2017-06-05 05:01:00

标签: java spring-batch

我正在读取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> 

1 个答案:

答案 0 :(得分:1)

您需要将CustomItemWriterListener bean放入步骤范围,以便了解步骤ExecutionContext

<!-- note: scope="step" -->
<bean id="CustomItemWriterListener" scope="step"
             class="com.listeners.CustomItemWriterListener" >
    <property name="filename" value="#{stepExecutionContext['payloadfile']}" />
</bean>