【问题标题】:using Spring integration with spring batch使用 Spring 与 Spring Batch 的集成
【发布时间】:2016-05-04 03:22:06
【问题描述】:

我有一个 spring 批处理应用程序,它从文件中读取,进行一些处理,最后编写自定义输出。这一切都发生在一个步骤中。在下一步中,我有一个将输入文件存档的 tasklet(移动到另一个文件夹)。这个应用程序工作正常。但是,现在我需要在远程服务器上 sftp 输出文件,在那里它们将进一步处理。我得到了一种使用 spring 集成的 sftp 方法,其中我创建了一个输入通道,该通道提供给 outboundchannel 适配器。我将我的文件作为有效负载放入消息中并将消息发送到通道。我在这里看到的唯一问题是,每次我必须获取上下文时,我都需要加载 spring 配置文件,这似乎是完成任务的一种骇人听闻的方式。有谁知道将 SI 与 SB 集成的任何方法。

如果您想查看我的配置,请告诉我... 提前致谢!!

无需再次加载 spring 配置即可访问相同应用上下文的代码

public class AppContextProvider implements ApplicationContextAware{

    private static ApplicationContext ctx;

    public ApplicationContext getApplicationContext() {
        return ctx;
    }

    public void setApplicationContext(ApplicationContext appContext) throws BeansException {
        ctx = appContext;
    }
} 

将输出文件推送到 sftp 服务器的代码

log.info("Starting transfer of outputFile : " + absoluteOutputFileName);
final File file = new File(absoluteOutputFileName);
final Message<File> message = MessageBuilder.withPayload(file).build();
AppContextProvider context = new AppContextProvider();
final MessageChannel inputChannel = context.getApplicationContext().getBean("toChannel",MessageChannel.class);
inputChannel.send(message);
log.info("transfer complete for : " + absoluteOutputFileName);

【问题讨论】:

    标签: spring spring-integration spring-batch


    【解决方案1】:

    查看 Spring Batch 项目中的 spring-batch-integration 模块。在那里,我们有通过消息启动作业的组件。在您的情况下,您可以通过 FTP 下载文件,然后让 JobLaunchingMessageHandler 启动该作业。

    您还可以观看几年前我在 SpringOne 上就该主题共同发表的演讲视频:https://www.youtube.com/watch?v=8tiqeV07XlI

    【讨论】:

    • 感谢您的评论。我会通过它,同时我找到了一种方法来获得我的应用程序的相同应用程序上下文。请建议这样做是否正确,或者您是否发现任何问题。在我原来的问题中添加了代码
    • 为什么要为每个运行的作业创建一个 ApplicationContext?
    • 我没有为每个作业创建 ApplicationContext。我加载一次弹簧配置,然后为每个文件一个一个调用作业。(我正在检查 i\p 文件夹中的可用文件并运行一个循环)
    【解决方案2】:

    正如迈克尔所说,您一定会想看看并利用spring-batch-integration。我们实际上使用 Spring Integration 作为某种包装器来启动 100% 的 Spring Batch 作业。

    我们发现一个特别有用的用例是利用spring-integration-file 入站通道适配器轮询暂存目录以指示新批处理文件何时到达。当轮询器找到一个新文件时,我们然后使用输入文件名作为参数启动一个新的批处理作业。

    这对于可重新启动性来说是一个真正的帮助,因为我们现在每个文件都有一个作业实例,而不是让作业以任意间隔启动,然后在暂存文件夹中的许多文件之间进行分区。现在,如果在处理过程中发生异常,您可以立即针对特定作业重新启动,而不是等待 100 个“好”文件中的 99 个先完成。

    【讨论】:

    • @Dean 你能分享一下你用来通过 SI 调用你的工作的代码吗?
    • 不幸的是,它目前是专有的,但我们实际上正在清理代码的几个项目特定部分,以便我们可以与社区分享......希望在几个月。
    猜你喜欢
    • 2018-07-02
    • 2011-10-16
    • 2012-10-20
    • 2015-11-03
    • 2016-02-26
    • 2023-03-12
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多