如何自定义 spring 集成流程

How to customize spring integration flow

我有这样的要求

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

此时我正在考虑 一个流程来处理 FTP 端 并获取文件并下载它。

流量#02 将选择文件并进行上述处理

我的问题是我是否应该在上述所有这些步骤中使用转换器。如果我有所有转换器的一个流程也可以吗?还是应该将其分解为子流程?

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

此外,如果我放置一个异常处理通道,我是否真的知道异常是在哪一步抛出的?

如果您不熟悉许多其他 Spring 集成组件,例如 Enricherhttps://docs.spring.io/spring-integration/reference/html/message-transformation.html#content-enricher and JPA channel adapters: https://docs.spring.io/spring-integration/reference/html/jpa.html#jpa

,您真的可以使用转换器做任何事情

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

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

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

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

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