Я работаю над настройкой пакетного задания пружины, которое выполняет обычную операцию 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.
Кто-нибудь успешно подключил писателя к плоскому файлу в слушателе?
Спасибо за помощь