web-dev-qa-db-ja.com

Spring Batchでマルチスレッドを設定するにはどうすればよいですか?

チュートリアルのSpringBatchプロジェクトを正常にセットアップしました。 「春のレベル」でマルチスレッド化できるかどうか本当に知りたいです。

私が欲しいものの基本的な考え方は、タスクまたはタスクステップのリストを作成し、それらを独立したスレッドによって、理想的には「n」個のスレッドに制限されたプールから取得して処理できるようにすることです。

これは可能ですか?もしそうなら、どのように?誰かが私を現在いる場所からその地点に案内してくれるでしょうか?

私が持っている簡単なプロジェクトは、このチュートリアルからのものです ここ 。基本的に、画面にメッセージを出力するさまざまなタスクがあります。

これが私の現在のsimpleJob.xmlファイルで、ジョブの詳細が含まれています。

<import resource="applicationContext.xml"/>

    <bean id="hello" class="helloworld.PrintTasklet">
        <property name="message" value="Hello"/>
    </bean>

    <bean id="space" class="helloworld.PrintTasklet">
        <property name="message" value=" "/>
    </bean>

    <bean id="world" class="helloworld.PrintTasklet">
        <property name="message" value="World!\n"/>
    </bean>

    <bean id="taskletStep" class="org.springframework.batch.core.step.tasklet.TaskletStep" >
        <property name="jobRepository" ref="jobRepository"/>
        <property name="transactionManager" ref="transactionManager"/>
    </bean>

    <bean id="simpleJob" class="org.springframework.batch.core.job.SimpleJob">
        <property name="name" value="simpleJob" />
        <property name="steps">
            <list>
                <bean parent="taskletStep">
                    <property name="tasklet" ref="hello"/>
                </bean>
                <bean parent="taskletStep">
                    <property name="tasklet" ref="space"/>
                </bean>
                <bean parent="taskletStep">
                    <property name="tasklet" ref="world"/>
                </bean>
            </list>
        </property>
        <property name="jobRepository" ref="jobRepository"/>
    </bean>

私のappContextには、ジョブリポジトリBean(SimpleJobRepository)、トランザクションマネージャー(ResourceLessTransactionManager)、ジョブランチャー(SimpleJobLauncher)が含まれています。必要に応じてこのコードを提供することもできますが、この投稿を大量のXMLで埋め尽くしたくありませんでした。

助けてくれてありがとう!

13
Cuga

スプリットを作成すると、異なるブランチ間でマルチスレッドを使用できるようになります。 TaskExecutorを使用して、並列処理ポリシーを定義します。

マルチスレッドステップ を参照してください

マルチスレッドとMapJobRepositoryを使用する場合は、必ず最新バージョンのSpring Batchを使用してください(最新バージョンより前は、このJobRepositoryはスレッドセーフではありませんでした)。

13

ジャンの答えを見てください。簡単な方法は、SimpleAsyncTaskExecutorのBeanを作成し、タスクレットを関連付けてこのBeanを使用することです。

<bean id="simpleTaskExecutor"
    class="org.springframework.core.task.SimpleAsyncTaskExecutor">
    <property name="concurrencyLimit" value="10"/>
</bean>

<batch:job id="jobTest">
    <batch:step id="step1">
    <!-- throttle-limit default is 4. Increase this to ensure that a thread pool is fully utilized -->
        <batch:tasklet task-executor="simpleTaskExecutor" throttle-limit="20">
            <batch:chunk />
        </batch:tasklet>
    </batch:step>
</batch:job>
4
HenioJR