春批。如何获取正在处理的元素的数量

时间:2014-08-07 07:53:25

标签: xml database spring-batch

我们使用spring批处理将XML文件的元素存储到我们的数据库中。是否可以在将数据插入数据库时​​检索正在处理的元素的数量?

要清除,这是我的工作配置:                                                                                        

<bean id="xmlItemReader" scope="step"
    class="org.springframework.batch.item.xml.StaxEventItemReader">
    <property name="fragmentRootElementName" value="person" />
    <property name="resource" value="#{jobParameters[xmlPath]}" />
    <property name="unmarshaller" ref="personUnmarshaller" />
</bean>

<!-- Read and map values to object, via jaxb2 -->
<bean id="personUnmarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
        <list>
            <value>com.batch.input.Person</value>
        </list>
    </property>
</bean>     

<bean id="personItemWriter" scope="step"
    class="org.springframework.batch.item.database.JdbcBatchItemWriter">
    <property name="dataSource" ref="dataSource" />
    <property name="sql">
        <value>
        <![CDATA[        
            insert into PERSON (
                ID_XML, PERSON_ID, ITEM_NUM,
                NAME, SURNAME1, SURNAME2) 
            values (
                #{jobParameters[ID_XML]}, :personID, 
                #{stepExecution.writeCount},        -- This is what we want          
                :name, :surname1, :surname2)
        ]]>
        </value>
    </property>
    <!-- It will take care matching between object property and sql name parameter -->
    <property name="itemSqlParameterSourceProvider">
        <bean
            class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" />

    </property>
</bean>

正如您所看到的,我们尝试使用 stepExecution.writeCount 来获取此数字,但它始终返回0,同时使用readCount属性。

数据库序列不是解决方案,因为它必须是当前XML文件中的数字,从0开始。

它必须独立于正在处理的块,因为自动提交。我们的自动提交是1000.如果我们有10000个元素,我们需要存储从0到9999的数字,而不是从0到999的10个组。

XML文件中的顺序并不重要,我们只需要对元素进行编号。

有任何帮助吗?感谢

1 个答案:

答案 0 :(得分:2)

检查ItemCountAware:让Person实现此接口并使用Person.itemCount属性作为sql参数值。