2

これは非常に簡単な設定です。5mの可能性のあるレコードのファイルがあり、それを読み取って作業を行い、データベースに送信する必要があります。処理と書き込みの仕組みは重要ではありません。パスとファイル名[/opt/etc/app/partner/input_file.csv]をパラメーターとしてプロセスに渡すことができる必要があります。それはとても簡単です。それをJobParametersに追加して、JobLauncherに渡してください。

JobParametersBuilder jpBuilder = new JobParametersBuilder() ;
jpBuilder.addString("filePath", "/opt/etc/app/partner/input_file.csv") ;
jobLauncher.run(job, jpBuilder.toJobParameters() ;

完了しました。コンテキストに認識させるためです。ここでも、jobParametersを参照するという単純な問題です。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:batch="http://www.springframework.org/schema/batch"
    xsi:schemaLocation="
    http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <description>PoC to demonstrate variable row content handling</description>

    <batch:job id="poc" job-repository="jobRepository" incrementer="runIdIncrementer" restartable="true">
        <batch:step id="pocReadWriteStep">
            <batch:partition step="step" partitioner="partitioner">
                <batch:handler task-executor="taskExecutor"/>
            </batch:partition>
        </batch:step>
    </batch:job>

    <batch:step id="step">
        <batch:tasklet task-executor="taskExecutor" throttle-limit="20" transaction-manager="transactionManager" allow-start-if-complete="true">
            <batch:transaction-attributes isolation="READ_UNCOMMITTED"/>
            <batch:chunk
                reader="reader"
                processor="processor"
                writer="writer"
                commit-interval="20">
            </batch:chunk>
        </batch:tasklet>
    </batch:step>

    <bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
        <property name="resource" value="file:#{jobParameters['filePath']}"/>
        <property name="lineMapper">
            <bean class="org.springframework.batch.item.file.mapping.PatternMatchingCompositeLineMapper">
                <property name="tokenizers">
                    <map>
                        <entry key="*" value-ref="lineTokenizer"/>
                    </map>
                </property>
                <property name="fieldSetMappers">
                    <map>
                        <entry key="*" value-ref="fieldSetMapper"/>
                    </map>
                </property>
            </bean>
        </property>
    </bean>

    <bean id="lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"/>

    <bean id="fieldSetMapper" class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper"/>

    <bean id="processor" class="com.verifi.springbatchpoc.PocProcessor"/>

    <bean id="writer" class="com.verifi.springbatchpoc.PocWriter"/>

    <bean id="runIdIncrementer" class="org.springframework.batch.core.launch.support.RunIdIncrementer"/>

    <bean id="partitioner" class="org.springframework.batch.core.partition.support.MultiResourcePartitioner">
        <property name="resources" value="file:#{jobParameters['filePath']}"/>
    </bean>

    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="20"/>
    </bean>

</beans>

MultiResourcePartitionerでは、jobParametersへの参照を認識できないように見えることを除いて。パスとファイル名をハードコーディングすることはできますが、それは非常に満足のいくものですが、この実装のメールは含まれていません。

誰かが尋ねるだろうと確信しているので、ここにエラーからのスタックトレースがあります(とにかくその一部です)。

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    ... 46 more
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'jobParameters' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext'
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:207)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:71)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:52)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:97)
    at org.springframework.expression.common.CompositeStringExpression.getValue(CompositeStringExpression.java:82)
    at org.springframework.expression.common.CompositeStringExpression.getValue(CompositeStringExpression.java:1)
    at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:138)
    ... 52 more

考え、コメント、提案?

4

1 に答える 1

5

次のようにscope="step"を追加する必要があると思います。

 <bean id="partitioner" class="org.springframework.batch.core.partition.support.MultiResourcePartitioner"
scope="step">
        <property name="resources" value="file:#{jobParameters['filePath']}"/>
    </bean>
于 2013-01-31T15:20:37.267 に答える