【问题标题】:Launching Spring batch job启动 Spring 批处理作业
【发布时间】:2011-08-17 21:12:15
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: java spring ejb spring-batch


    【解决方案1】:
    • 我有一个问题,我需要从 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>
    

    这将启动这项工作。

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

    【讨论】:

    • 感谢您挖掘这个问题。我已经实施了你的建议(stackoverflow.com/questions/7152467/spring-serviceactivator——即使这个问题也解决了。只是我懒得在那里更新答案)。不过感谢您的努力。
    • 服务激活器可能需要一个 output-channel="nullChannel" 属性来处理响应消息
    • 我对 This can be done with a JobLauncher adapter, that is already available from Spring Batch Admin 应该如何实现有点困惑?
    【解决方案2】:

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

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

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

    【讨论】:

    • 嗨,很抱歉回复晚了。我想利用 spring 的面向块/拆分/步进的特性,这些特性不能直接使用 MDB 完成。如果我已完成将输入写入物理磁盘上的文件,您能否告诉我如何启动工作?如果我单独使用 spring 如何触发工作?
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多