java - 启动 Spring 批处理作业

标签 java spring ejb spring-batch

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

还有其他有效的方法吗?我不想使用 quartz 调度程序或其他任何东西,因为它增加了复杂性。 spring batch 本身是否有任何接口(interface)可以在文件进入目录后立即启 Action 业?如果能更好地做到这一点,我们将不胜感激。

谢谢。

最佳答案

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

这样做的一种方法是使用一些 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>

这将启 Action 业。

“input.file”是一个在运行时绑定(bind)的参数(因此 #{...} ):

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

关于java - 启动 Spring 批处理作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7099543/

相关文章:

java - 如何将ISO8601格式转换成毫秒?

Java – 服务器仅在客户端停止时响应

Spring MVC 3 JSTL 不会在 Tomcat 5.5 中输出值

java - Spring Tomcat 多个 HTTPS 端口

oracle - EJB 事务与 Oracle 事务

multithreading - UserTransaction 中的 begin() 抛出空指针异常

java - 如何在android中设置特定时间的日历

java - 为什么 "=="有时会与 String.trim 一起使用?

Spring 安全 : How to rename the "_spring_security_remember_me" checkbox field?

jakarta-ee - Java EE,将一个 EJB 注入(inject)另一个 EJB