我有一个弹簧批处理应用程序,它从文件读取,进行一些处理,最后编写自定义输出。这一切都是一步到位的。在下一步中,我有一个归档输入文件的tasklet(移动到另一个文件夹)。这个应用程序工作正常。但是,现在我要求sftp输出远程服务器上的文件,他们将进一步处理。我有一种使用spring集成的sftp方法,我创建了一个输入通道,输入到outboundchannel适配器。我将我的文件作为有效载荷放入消息中并将消息发送到通道。我在这里看到的唯一问题是每次我必须得到上下文我需要加载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);
答案 0 :(得分:4)
查看Spring Batch项目中的spring-batch-integration
模块。在那里,我们有通过消息启动作业的组件。在您的情况下,您将文件FTP下来然后让JobLaunchingMessageHandler
启动作业。
您还可以观看我几年前在SpringOne上就此主题共同演讲的视频:https://www.youtube.com/watch?v=8tiqeV07XlI
答案 1 :(得分:0)
正如迈克尔所说,你绝对想看看并利用spring-batch-integration
。我们实际上使用Spring Integration作为各种包装,以启动100%的Spring Batch作业。
我们发现一个特别有用的用例是利用spring-integration-file
入站通道适配器轮询登台目录,以指示新批处理文件何时着陆。当轮询器找到新文件时,我们然后使用输入文件名作为参数启动新的批处理作业。
这对于可重新启动性来说是一个真正的帮助,因为我们现在每个文件有一个作业实例,而不是以任意间隔启动作业然后分区,然而许多文件碰巧在暂存文件夹中。现在,如果在处理期间发生异常,您可以立即将特定作业定位为重新启动,而不是等待100&#34; good&#34;文件先完成。