使用Spring与Spring批处理集成

使用Spring与Spring批处理集成,spring,spring-integration,spring-batch,Spring,Spring Integration,Spring Batch,我有一个spring批处理应用程序,它从文件中读取数据,进行一些处理,最后编写一个定制的输出。这一切都是一步到位的。在下一步中,我有一个tasklet,它将输入文件归档并移动到另一个文件夹。这个应用程序运行得很好。但是,现在我需要在远程服务器上对sftp输出文件进行进一步处理。我找到了一种使用spring集成实现sftp的方法,在这里我创建了一个输入通道,该通道向outboundchannel适配器提供数据。我将我的文件作为有效负载放入消息中,并将消息发送到通道。我在这里看到的唯一问题是,每次我

我有一个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);
看看SpringBatch项目中的SpringBatch集成模块。在那里,我们有通过消息启动作业的组件。在您的情况下,您需要将文件FTP下载,然后让JobLaunchingMessageHandler启动作业

您还可以观看几年前我在SpringOne上共同发表的一篇演讲视频,主题是:

看看SpringBatch项目中的SpringBatch集成模块。在那里,我们有通过消息启动作业的组件。在您的情况下,您需要将文件FTP下载,然后让JobLaunchingMessageHandler启动作业


您还可以观看几年前我在SpringOne上共同发表的一篇关于这个主题的演讲视频:

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

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


在可重启性方面,这是一个真正的帮助,因为我们现在每个文件有一个作业实例,而不是以任意间隔启动作业,然后在临时文件夹中的多个文件之间进行分区。现在,如果在处理过程中发生异常,您可以立即将特定作业作为重新启动的目标,而不是等待100个好文件中的99个先完成。

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

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


在可重启性方面,这是一个真正的帮助,因为我们现在每个文件有一个作业实例,而不是以任意间隔启动作业,然后在临时文件夹中的多个文件之间进行分区。现在,如果在处理过程中出现异常,您可以立即将特定作业作为重新启动的目标,而不是等待100个好文件中的99个先完成。

谢谢您的评论。在我找到一种方法来获取我的应用程序的相同应用程序上下文的同时,我将仔细研究它。请建议这是否是正确的方式去做,或者如果你看到任何问题与此。在我的原始问题中添加了代码为什么要为运行的每个作业创建ApplicationContext?我不是为每个作业创建ApplicationContext。我加载spring配置一次,然后针对每个文件逐个调用作业。我正在检查I\p文件夹中的可用文件并运行循环。谢谢您的评论。在我找到一种方法来获取我的应用程序的相同应用程序上下文的同时,我将仔细研究它。请建议这是否是正确的方式去做,或者如果你看到任何问题与此。在我的原始问题中添加了代码为什么要为运行的每个作业创建ApplicationContext?我不是为每个作业创建ApplicationContext。我加载spring配置一次,然后对每个文件逐个调用作业。我正在检查I\p文件夹中的可用文件,并运行循环@Dean你能分享你通过SI调用作业的代码吗?不幸的是,在这一点上它是专有的,但我们实际上正在清理代码中几个特定于项目的部分,以便与社区共享。。。。希望在几个月内。@Dean你能分享你用来通过SI调用你的工作的代码吗?不幸的是,在这一点上它是专有的,但我们是 实际上,在清理代码中几个项目特定部分的过程中,我们可以与社区共享它。。。。希望在几个月内。