Реализация SkipListener для записи неверных записей в плоский файл - PullRequest
1 голос
/ 30 сентября 2011

Я работаю над настройкой пакетного задания пружины, которое выполняет обычную операцию READ> PROCESS> WRITE. Тем не менее я пытаюсь реализовать прослушиватель, который будет захватывать записи, которые считаются недействительными на этапе PROCESS, и записывать их в файл журнала ошибок.

Мой класс слушателя использует экземпляр FlatFileItemWriter для записи данных. Однако Spring-Batch не создает экземпляра объекта записи должным образом.

Мой класс слушателя выглядит так:

    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 внутренне указан (для слушателя). Если я создаю abean вне слушателя и обращаюсь к нему, он возвращает экземпляр прокси-объекта FlatFileItemWriterClass.

Кто-нибудь успешно подключил писателя к плоскому файлу в слушателе?

Спасибо за помощь

1 Ответ

1 голос
/ 30 сентября 2011

Ну, почему бы вам не использовать писателя как обычный боб? Вы можете зарегистрировать его как поток , а для обхода промежуточного прокси вы можете использовать PropertPlaceholderConfigurer

я создал рабочий пример в моем репозитории github , но я думаю, что весенний пакет может потребовать улучшения здесь, должно быть проще реализовать регистрацию элементов ошибок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...