我正在设置执行传统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的代理实例。
有没有人成功将作家连接到监听器中的平面文件?
感谢您的帮助
答案 0 :(得分:1)
那你为什么不把作家用作普通的豆子?您可以register it as a stream并绕过步骤代理,您可以使用PropertPlaceholderConfigurer
我在my github repo下创建了一个工作示例,但我认为Spring批处理可能需要改进,应该更容易实现错误项目记录