实现SkipListener以将无效记录写入平面文件

时间:2011-09-30 17:00:08

标签: spring-batch

我正在设置执行传统READ>的弹簧批处理作业。过程>写操作。但是,我正在尝试实现一个侦听器,它将捕获在PROCESS阶段期间被忽略的记录并将其写入错误日志文件。

我的侦听器类使用FlatFileItemWriter的实例来编写数据。但是,spring-batch没有正确实例化writer实例。

我的监听器类看起来像这样:

    public class DTOProcessorListener extends SkipListenerSupport<AttributeReportGenerationDTO, AttributeValue> {

    private static final Logger LOGGER = LoggerFactory.getLogger(DTOProcessorListener.class);

    private FlatFileItemWriter<AttributeReportGenerationDTO> flatFileItemWriter;

    @Override
    public void onSkipInProcess(AttributeReportGenerationDTO item, Throwable t) {

        try {
            LOGGER.error("Record not processed for attribute value with ID : " + item.getAttributeValueId());
            List<AttributeReportGenerationDTO> list = new ArrayList<AttributeReportGenerationDTO>();
            list.add(item);
            flatFileItemWriter.write(list);
        } catch (Exception e) {
            LOGGER.error("Unable to write to the error output file", e);
        }
    }

    /**
     * @param flatFileItemWriter
     *            the flatFileItemWriter to set
     */
    public void setFlatFileItemWriter(FlatFileItemWriter<AttributeReportGenerationDTO> flatFileItemWriter) {

        this.flatFileItemWriter = flatFileItemWriter;
    }

}

我的作业配置XML如下所示:

<bean id="skipListener" class="something.DTOProcessorListener" scope="step">
        <property name="flatFileItemWriter">
            <bean id="errorItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
                <property name="resource" value="file:#{jobParameters['error.filename']}" />
                <property name="appendAllowed" value="true" />
                <property name="lineAggregator">
                    <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
                        <property name="fieldExtractor">
                            <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                                <property name="names"
                                    value="productTypeId, productTypeName, productId, productName, skuId, skuName, attributeValueId, attributeName, attributeValue, attributeType, nonEditableValueCheckSum, editableValueCheckSum" />
                            </bean>
                        </property>
                    </bean>
                </property>
                <property name="headerCallback">
                    <bean class="something.CsvHeaderImplementation">
                        <property name="headerString"
                            value="Product Type ID,Product Type,Product ID,Product Name,Sku ID,Sku Name,Attribute Value ID,Attribute Name,Attribute Value,Attribute Type,Check Sum 1,Check Sum 2" />
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

我收到错误

org.springframework.batch.item.WriterNotOpenException: Writer must be open before it can be written to

我无法在作业配置中设置流条目,因为FlatFileItemWriter的bean是在内部指定的(对于侦听器)。如果我在侦听器之外创建abean并引用它,则返回FlatFileItemWriterClass的代理实例。

有没有人成功将作家连接到监听器中的平面文件?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

那你为什么不把作家用作普通的豆子?您可以register it as a stream并绕过步骤代理,您可以使用PropertPlaceholderConfigurer

我在my github repo下创建了一个工作示例,但我认为Spring批处理可能需要改进,应该更容易实现错误项目记录