当前位置: 首页 > 知识库问答 >
问题:

使用Spring与Spring批处理的集成

温开畅
2023-03-14

我有一个spring批处理应用程序,它从文件中读取数据,进行一些处理,最后编写一个定制的输出。这一切都是一步到位的。在下一步中,我将使用一个tasklet来归档输入文件(移动到另一个文件夹)。这个应用程序运行良好。但是,现在我需要在远程服务器上对sftp输出文件进行进一步处理。我找到了一种使用spring integration实现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);

共有2个答案

越霖
2023-03-14

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

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

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

锺功
2023-03-14

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

你也可以看这段视频,我几年前在Spring一号上共同发表了一个关于这个主题的演讲:https://www.youtube.com/watch?v=8tiqeV07XlI

 类似资料:
  • 我正在尝试将BeanIO与spring Batch集成。使用BeanIO,我正在读取一个固定长度的流文件。我已经测试并验证了使用独立类读取平面文件的代码,它可以无缝地工作,但是当我试图将它与Spring Batch集成时,BeanIOFlatFileItemReader的doRead()方法没有被调用,而且我编写的RedemptionEventCustomProcessor是如何直接被调用的。 我

  • 我正在将Spring Boot项目与Spring批处理和数据jpa项目集成。所有与作业和数据配置相关的东西都是正确的,除了将我的作业编写器结果保存在数据库中。在我读取文件并对其进行处理后,我无法将其写入mysql数据库。没有错误,但也没有插入。有趣的是我的数据源已配置。因为在插入之前,我可以从数据库中获取示例记录。请协助我解决这个问题。 我的申请。属性: 批次配置: 道类: 作家类: temPer

  • 当RabbitMq消息到达队列时,我目前正在使用IntegrationFlow来触发作业执行。IntegrationFlow的AmqpInFronChannelAdapter和作业的第一步的ItemReader都配置为从同一队列中读取消息。 我遇到的问题是IntegrationFlow的AmqpInboundChannelAdapter读取RabbitMQ消息,然后ItemReader再也找不到该

  • Spring Integration Java DSL Reference和Spring Batch Java配置文档说明了如何将Java配置用于Spring Integration和Spring Batch。 但它们没有说明如何为Spring批处理集成配置它。如何使用DSL配置JobLaunchingGateway? 干杯,曼诺

  • 我需要从远程SFTP服务器下载一个文件,并使用spring batch处理它们。我已经实现了使用Spring集成下载文件的代码。但我无法从Spring集成组件启动Spring批处理作业。我有以下代码: 但这不起作用(上一个方法中的错误),因为找不到文件类型的bean。我不能把这两部分连在一起。如何连接集成和批处理?

  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。