如何自定义spring集成流程

Posted

技术标签:

【中文标题】如何自定义spring集成流程【英文标题】:How to customize spring integration flow 【发布时间】:2020-04-20 11:39:15 【问题描述】:

我有这样的要求

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

如果您不熟悉许多其他 Spring Integration 组件,例如 Enricher:https://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。它将使用 bean 名称和配置源调用 toString(),以确定流中发生错误的异常位置。

【讨论】:

谢谢,我也看看nricher。

以上是关于如何自定义spring集成流程的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义方法添加到 spring 集成 ftp 网关接口?

Spring SAML Okta - 如何在 IDP 启动的流程中重定向到自定义 URL

Spring Security 自定义流程

集成 Spring Security:身份验证自定义 UserDetailsS​​ervice

Spring集成Java DSL:指定自定义反序列化器

Spring Security - CAS 自定义到 LDAP 集成