如何在Spring批处理中使用FlatFileItemWriter写入stdout?

时间:2011-09-07 17:46:29

标签: java spring iostream java-io spring-batch

我在spring批处理项目的bean定义文件中配置了以下编写器:

<bean id="writer" class="org.springframework.batch.item.file.FlatFileItemWriter">
    <property name="resource" value="file:/path/to/somefile"/>
    <property name="lineAggregator">
        <bean class="MyCustomLineAggregator"/>
    </property>
</bean>

现在,我不想写入/ path / to / somefile,而是希望输出转到stdout,原因是我想通过命令行启动器启动这个作业并将输出传递给另一个unix程序。

我尝试将资源属性设置为“file:/ dev / stdout”,但后来我得到了异常: org.springframework.batch.item.ItemStreamException:无法创建文件:[/ dev / stdout]

我试着看看是否有一个开箱即用的资源可以解决这个问题,但我对于哪个人可以完成这项任务感到有点无能为力......

感谢您的帮助。

编辑:以下是我提出的解决方案,遵循您的建议:

import java.util.List;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.file.transform.LineAggregator;

public class StdoutWriter<T> implements ItemWriter<T> {

LineAggregator<T> lineAggregator;

public void setLineAggregator(LineAggregator<T> lineAggregator) {
    this.lineAggregator = lineAggregator;
}

@Override
public void write(List<? extends T> items) throws Exception {
    for (T item : items) {
        System.out.println(lineAggregator.aggregate(item));
    }
}

}

2 个答案:

答案 0 :(得分:2)

我认为开箱即用的东西并不能满足您的需求。创建一个简单ItemWriter的{​​{1}}就足够了。然后,如果您还想要文件,可以使用CompositeItemWriter将两者绑在一起。

或者,您可以使用自定义ItemWriterListener并在那里进行打印。

答案 1 :(得分:0)

你可以用另一个hack写入stdout。实际上,您可以将/dev/stdout指定为输出文件资源。请务必在作者中将shouldDeleteIfExists设置为false并将appendAllowed设置为true,否则您将收到运行时错误。