Spring批处理从文件中检索对象列表并在输出文件中返回单行

时间:2017-05-12 20:34:38

标签: java list csv spring-batch jobs

我使用spring batch读取CSV文件作为输入,我有2个CSV文件作为输出。

第一个文件包含约100行。

输入文件包含5个colones id,typeProduct和price。 我只有两种产品

我遍历所有这些行,我写了两个输出文件。

对于这两个文件,包含产品类型的单行和具有相同类型的所有这些产品的价格总和。

所以我需要在写入输出文件之前。我希望获取列表中的所有行以创建条件并向我的对象添加新属性,例如结果if sum> 5000将获取其他不太好的值,例如。并将它们显示在文件

中的输出行中

这是我的产品

public class Product {

    private Long idt;
    private String typeProduct;
    private Double price;
    private String result;

}

这是我工作的定义

    <batch:job id="exampleMultiWritersJob">
    <batch:step id="stepMultiWriters">
        <batch:tasklet transaction-manager="txManager">
            <batch:chunk reader="exampleFileSourceReader" writer="exampleMultiWriters" commit-interval="10">
                <batch:streams>
                    <batch:stream ref="cnraCosWriter" />
                    <batch:stream ref="cnraCopWriter" />
                    <batch:stream ref="rcarCosWriter" />
                    <batch:stream ref="rcarCopWriter" />
                </batch:streams>
            </batch:chunk>
        </batch:tasklet>
    </batch:step>

</batch:job>
<bean id="exampleFileSourceReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="resource" value="file:#{jobParameters['file']}" />
<property name="lineMapper">
    <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
        <!-- split it -->
        <property name="lineTokenizer">
            <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">

                    <!-- this is missing --> 
                    <property name="delimiter" value=";"/>

                    <property name="names" value="idt,productType,price" />


            </bean>
        </property>
        <property name="fieldSetMapper">
            <!-- map to an object -->
            <bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">

                <property name="prototypeBeanName" value="exampleFileMapper" />
            </bean>
        </property>
    </bean>
</property>
</bean>
<bean id="exampleFileMapper" class="ma.controle.gestion.modele.Product" scope="prototype"/>

              

这是分类器方法

public class ExampleWriterRouteImpl {

@Classifier
public String classify(Product batch){
    if(batch.getTypeProduct().equals("Telephone"))
        return "tel";
    else if(batch.getTypeProduct()).equals("PC")))
        return "pc";

    return null;
}
}

<bean id="classifier"  class="org.springframework.batch.classify.BackToBackPatternClassifier">
<property name="routerDelegate">
    <bean class="ma.controle.gestion.springbatch.ExampleWriterRouteImpl" />
</property>
<property name="matcherMap">
    <map>
        <entry key="tel" value-ref="telWriter" />
        <entry key="pc" value-ref="pcWriter" />

    </map>
</property>

<bean id="telWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
<!-- write to this csv file -->
<property name="resource" value="file:C:/output/tel.csv" />
<property name="shouldDeleteIfExists" value="true" />
<property name="shouldDeleteIfEmpty" value="true" />
<property name="appendAllowed" value="true" />

<property name="lineAggregator">
    <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
        <property name="delimiter" value=";" />
        <property name="fieldExtractor">
            <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                <property name="names" value="productType,price(Sum of all prdouctType),result" />
            </bean>
        </property>
    </bean>
</property>

   <bean id="pcWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
<!-- write to this csv file -->
<property name="resource" value="file:C:/output/pc.csv" />
<property name="shouldDeleteIfExists" value="true" />
<property name="shouldDeleteIfEmpty" value="true" />
<property name="appendAllowed" value="true" />

<property name="lineAggregator">
    <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
        <property name="delimiter" value=";" />
        <property name="fieldExtractor">
            <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                <property name="names" value="productType,price(Sum of all prdouctType),result" />
            </bean>
        </property>
    </bean>
</property>

所以我需要对所有具有相同类型且只有一条输出线的产品求和,其中包含产品类型以及每个输出文件的价格和结果总和。

我不知道如何检索这些对象的列表,并且最后只检索一行。

感谢。

0 个答案:

没有答案