启动Spring批处理作业

时间:2011-08-17 21:12:16

标签: java spring ejb spring-batch

我有一个问题,我需要从MQ队列接收一系列消息并将其写入文件并启动弹出批处理作业,并将该文件作为输入。现在我正在考虑从MDB本身使用有线@Autowired JobLauncher jobLauncher and @Autowired Job job;启动这项工作。但我觉得这不是一个好方法,因为Spring批处理可能会创建一系列线程,因此EJB不支持多线程。

还有其他有效的方法吗?我不想使用石英调度程序或其他任何东西,因为它增加了复杂性。春天批处理中是否有任何接口在文件进入目录后很快就会启动作业?任何领导这样做的人都会受到赞赏。

感谢。

2 个答案:

答案 0 :(得分:9)

  • 我有一个问题,我需要从MQ队列接收一系列消息并将其写入文件并启动弹出批处理作业,并将该文件作为输入

这样做的一种方法是使用一些Spring Integration,你将有一个文件轮询器,它会轮询一个新文件:

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

file message(java.io.File)改编为file name(String),因为这是Spring Batch所需要的。这可以通过JobLauncher适配器完成,该适配器已经可以从Spring Batch Admin here获得:

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

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

    return new JobLaunchRequest(job, jobParameters);
}

将其打包到JobLaunchRequest(这只是JobJobParameters的持有者)并将此请求[作为消息]发送给JobLaunchingMessageHandler

<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>

答案 1 :(得分:0)

我不确定我理解为什么你有一个消息队列,一个消息驱动的POJO / EJB和一个批处理作业。

一种方法是让消息驱动的POJO / EJB完成工作。它已经是一个异步过程。您可以汇集消息驱动的bean,以便有足够的工作人员来处理负载。为什么要增加复杂性?

如果您不想这样做,请忘记队列并单独使用Spring Batch。我不愿意这两个。