我们使用 Spring Batch 将 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>
正如你所看到的,我们尝试使用以下方法获取这个数字步骤执行.writeCount,但它总是返回 0,同样具有 readCount 属性。
数据库序列不是解决方案,因为它必须是当前 XML 文件内的数字,从 0 开始。
它必须独立于正在处理的块,因为自动提交。我们的自动提交是1000。如果我们有10000个元素,我们需要存储从0到9999的数字,而不是从0到999的10组。
XML 文件内的顺序并不重要,我们只需要对元素进行编号即可。
有什么帮助吗?谢谢