根据项目的属性作为条件,将数据路由到项目编写器中的多个文件

Vic*_*cky 7 spring-batch

我收到了读者的项目清单.

Code在每个项目对象中都有一个属性,它具有我手头未知的几个可能的值.

1)根据Code每个项目的值,我想在与之相关的输出文件中写出该特定项目Code.例如,如果我当前的项目Code是"abc",则该项应写入编写器中的abc.txt.

2)如果Code当前项目中存在"xyz",且该文件不存在,则应创建一个新文件,该项目应转到该文件.

3)对于基于此创建的所有这样的多个文件Code,我还想添加页眉和页脚回调以输入一些细节,例如每个文件中的项目数.

是否有可能有一个满足3个以上要求的作家?

我知道使用multiresourceitemwriter,可以在多个输出文件之间划分数据.但据我所知,这种划分是基于物品的数量.例如,file1中的前10个项目,file2中的下10个项目,依此类推.

但是如何根据我的问题中提到的项属性将数据路由到输出文件?

我很熟悉Spring Batch,只需要一些指导,因为这是我第一次遇到这种问题.

谢谢阅读!

Ser*_*uşu 9

如果我正确理解您的问题,您需要一些项目.

首先,实现Classifier接口的分类

public class ItemCodeClassifier {
    @Classifier
    public String classify(Item item) {
        return item.getCode().getKey();// returns "abc", "xyz"
    }
}
Run Code Online (Sandbox Code Playgroud)

其次是使用上述方法的路由器实现

<bean id="classifier"  class="org.springframework.batch.classify.BackToBackPatternClassifier">
    <property name="routerDelegate">
        <bean class="ItemCodeClassifier" />
    </property>
    <property name="matcherMap">
        <map>
        <entry key="abc" value-ref="abcItemWriter" />
        <entry key="xyz" value-ref="xyzItemWriter" />
        </map>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

最后,一个ClassifierCompositeItemWriter

<bean id="ItemWriter" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter">
<property name="classifier" ref="classifier" />
</bean
Run Code Online (Sandbox Code Playgroud)

没有编译上面但希望它有所帮助.


Mic*_*low 1

我会尝试至少两种策略

  1. 批处理将所有数据写入临时数据库表,简单的工具/批处理/脚本创建单独的文件 - 我不确定页眉/页脚,但一如既往,人们可能会说“让我们保持便宜”
  2. itemWriter 动态创建和管理所需的 writer,可能使用抽象的预配置 writer/bean 作为模板,只要您忽略重新启动场景,这听起来“很简单”