首页 > 解决方案 > 如何自定义spring集成流程

问题描述

我有一个要求

  1. 文件来自 FTP
  2. 文件被复制到本地目录
  3. 文件被拾起
  4. 服务器 1 解析和读取
  5. 服务 2 丰富 XYZ
  6. 服务3丰富CDY
  7. service 4 将数据持久化到数据库中,并获取生成的 ids 的集合(稍后需要)
  8. 服务 5 在服务 4 的基础上丰富另一条信息
  9. 服务 6 将向另一个系统发送消息
  10. 服务 7 将再次更新数据
  11. 服务 8 然后会做一些事情等
  12. 将文件移回完成目录

在这一点上,我正在考虑有一个流程来处理 FTP 端并获取文件并下载它。

flow # 02 将选择文件并按照上述说明进行处理

我的问题是我是否应该在上述所有这些步骤中使用变压器。如果我对所有变压器都有一个流程,或者我应该将其分解为子流程,也可以吗?

如果任何转换器抛出异常,它会忽略其余的转换器并进入错误通道吗?

另外,如果我放置一个异常处理通道,我真的会知道异常是在哪一步引发的吗?

标签: java-8spring-integrationspring-integration-dslspring-integration-sftp

解决方案


如果您不熟悉许多其他 Spring Integration 组件,您真的可以使用转换器做任何事情,例如Enricherhttps ://docs.spring.io/spring-integration/reference/html/message-transformation.html#content-enricher和 JPA通道适配器:https ://docs.spring.io/spring-integration/reference/html/jpa.html#jpa

即使您将拥有多个应用程序实例,您也确实可以在一个流程中完成所有操作。可以将流程配置为每个步骤都可以分布到整个集群以进行均匀计算的方式。另一方面,对于某些逻辑单元,我真的将我的流程分成了几个。

如果一个步骤引发异常,您确实不会再带着该消息向下游走。这与常规 Java 程序的工作方式完全相同。

是的,从某个版本开始,我们将整个组件添加到异常消息中:

throw IntegrationUtils.wrapInHandlingExceptionIfNecessary(messageToUse,
                () -> "error occurred in message handler [" + this + "]", e);

注意this。它将toString()使用 bean 名称和配置源进行调用,以确定流中发生错误的异常位置。


推荐阅读