繁体   English   中英

启动 Spring 批处理作业

[英]Launching Spring batch job

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

有没有其他有效的方法来做到这一点? 我不想使用石英调度程序或其他任何东西,因为它增加了复杂性。 spring 批处理本身是否有任何接口在文件进入目录后立即启动作业? 任何能更好地做到这一点的线索将不胜感激。

谢谢。

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

一种方法是使用一点 Spring 集成,您将有一个文件轮询器,它将轮询新文件:

<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 获得:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM