使用 Spring 与 spring 批处理的集成

using Spring integration with spring batch

我有一个 spring 批处理应用程序,它从文件中读取数据,进行一些处理,最后写入自定义输出。这一切都在一步中发生。在下一步中,我有一个 tasklet,它归档输入文件(移动到另一个文件夹)。此应用程序有效 fine.But,现在我需要在远程服务器上对文件进行进一步处理的 sftp 输出文件。我得到了一种使用 spring 集成进行 sftp 的方法,我在其中创建了一个输入通道,该通道馈送到出站通道适配器。我将我的文件作为有效载荷放入消息中并将消息发送到通道。我在这里看到的唯一问题是,每次我必须获取上下文时,我都需要加载 spring 配置文件,这似乎是完成任务的一种 hackish 方式。有谁知道有什么方法可以将 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 Batch 项目中的 spring-batch-integration 模块。在那里,我们有通过消息启动作业的组件。在你的情况下,你会 FTP 文件然后让 JobLaunchingMessageHandler 启动作业。

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

正如 Michael 所说,您肯定会想要查看并利用 spring-batch-integration。我们实际上使用 Spring 集成作为各种包装器来启动 100% 的 Spring 批处理作业。

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

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