2

MQ キューから一連のメッセージを受信し、これをファイルに書き込み、ファイルを入力として春のバッチ ジョブを開始する必要があるという問題があります。現在、MDB自体から有線でジョブを起動することを考えてい@Autowired JobLauncher jobLauncher and @Autowired Job job;ます.しかし、Spring Batchは一連のスレッドを作成する可能性があり、EJB自体はマルチスレッドをサポートしていないため、これは良いアプローチではないと感じています.

これを行う他の効果的な方法はありますか?複雑さが増すため、クォーツスケジューラなどは使用したくありません。ファイルがディレクトリに入った直後にジョブを起動するSpringバッチ自体にインターフェースはありますか? これを改善するためのリードをいただければ幸いです。

ありがとう。

4

2 に答える 2

9
  • MQ キューから一連のメッセージを受信し、これをファイルに書き込み、ファイルを入力として春のバッチ ジョブを開始する必要があるという問題があります。

これを行う 1 つの方法は、新しいファイルをポーリングするファイル ポーラーを持つ Spring Integration を少し使用することです。

<file:inbound-channel-adapter id="filePoller"
                              channel="filesAreComing" 
                              directory="file:${input.directory}"
                              filename-pattern="test*" />

file message( java.io.File ) を( String ) に適応させfile nameます。これは、Spring Batch が必要とするものです。これは、Spring Batch Admin からすでに利用可能な JobLauncher アダプターを使用して実行できます

@ServiceActivator
public JobLaunchRequest adapt(File file) throws NoSuchJobException {

    JobParameters jobParameters = new JobParametersBuilder().addString(
            "input.file", file.getAbsolutePath()).toJobParameters();

    return new JobLaunchRequest(job, jobParameters);
}

それを a ( aとJobLaunchRequestの単なるホルダー)にラップし、この要求を [メッセージとして] に送信します。JobJobParametersJobLaunchingMessageHandler

<service-activator input-channel="jobLauncher">
    <beans:bean class="org.springframework.batch.integration.launch.JobLaunchingMessageHandler">
        <beans:constructor-arg ref="jobLauncher" />
    </beans:bean>
</service-activator>

それは仕事を始めるでしょう。

「input.file」は、実行時にバインドされるパラメーターです (したがって #{...} ):

<bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
    <property name="resource" value="#{jobParameters[input.file]}" />
    ... line mapper and other props
</bean>
于 2011-09-24T05:54:24.673 に答える