简介
对于那些来自PI背景的人来说,CPI上缺少的一个值得注意的特性是实现异步集成的能力,具有精确一次(EO)的服务质量,以及相应的重新处理失败消息的能力。
添加JMS适配器(仅适用于内部CPI JMS队列)旨在填补通过提供使用内部JMS队列对异步场景的入站和出站消息处理进行解耦的功能,可以消除这一差距。一旦消息从入站IFlow持久化到JMS队列中,则出站IFlow将从JMS队列中提取该消息。出站处理过程中的任何错误都将导致根据重试设置(间隔、指数退避)自动重试消息。管理员/开发人员还可以使用WebUI中的操作视图手动重试JMS队列中的消息。此方法在使用JMS适配器配置带有重试的异步消息传递中进行了描述。
但是,JMS功能仅在企业版租户上可用,或者需要为非企业版租户单独购买。即使使用enterpriseedition,也存在资源限制,默认情况下,租户中只有30个JMS队列。许多在sappi上有大量足迹的组织通常会有数百个异步接口,从技术和成本角度来看,将接口迁移到CPI是一个挑战?
使用CPI的一个令人愉快的方面是由底层ApacheCamel框架支持的灵活建模环境。这与使用ProcessDirect适配器连接单独iFlow的能力相结合,真的为处理集成场景提供了无限创意设计的可能性—仅受想象力的限制。
如我的CPI开发技巧第1点所述,iFlow可以被隔离,这样公共功能可以作为单独的iFlow实现,并使用ProcessDirect适配器调用。用例是无限的,这篇博文从错误处理的角度介绍了如何使用它。
如果我们要实现1接口1队列设计,我们将很快用完"昂贵"的JMS队列。
本文的核心思想是实现一个通用的"错误处理"IFlow,它使用单个JMS队列来实现EO/再处理功能,可以通过ProcessDirect适配器调用与许多IFlow共享。
概述
下面是设计方法和步骤的概要处理顺序。
将场景拆分为发送方流和目标流的原因是,错误处理程序IFlow有一个入口点可将重试消息发送到。
还要注意,只有在处理过程中遇到错误时,消息才会持久化到JMS队列中。这与介绍部分中提到的方法不同,在入站消息处理期间,该方法会立即将消息持久化到JMS队列中。
集成流的详细信息
为了简单起见,大数据的,该场景将涉及一个发送方HTTP通道,它会触发Groovy脚本逻辑。以下是每个IFlow对象的详细信息。
发送方IFlow将发送方通道与场景所需的其余处理分离。理想情况下,此处不引入其他步骤(或最小步骤),因此此时不存在发生错误的可能性。消息通过ProcessDirect接收器通道发送到下一个IFlow。
此设置类似于PI中的发送方通信通道。
目标IFlow包含集成场景所需的所有处理逻辑和步骤。在这个例子中,它只是一个Groovy脚本。
此IFlow的入口点是通过ProcessDirect端点–它可以从发送方IFlow接收初始消息,或从错误处理程序IFlow接收重试消息(更多详细信息见下文)。
实现异常子进程块以捕获消息处理过程中发生的任何错误通过集成过程的步骤。发生错误时,异常子流程将以下标头附加到消息中,并将消息发送到错误处理程序IFlow的ProcessDirect端点。
RetryEndpoint–与此目标IFlow的ProcessDirect entry端点的值相同ErrorMessage–详细的异常消息
消息头可以使用ProcessDirect适配器跨IFlow,因此这允许后续错误处理程序IFlow知道要重试消息的端点。
设计的另一个重要方面是IFlow配置中需要允许以下头。这些是错误处理程序流在重试消息时传输的头文件(详细信息如下)。
错误处理程序IFlow是设计的核心。它由两部分组成流程:-
顶层集成流程–接收消息并将其存储到JMS队列中底层集成流程—从JMS队列中提取消息并发送到目标IFlow进行重试
以下是该流程关键部分的详细信息i以下:-
点1–处理此错误处理程序的直接入口端点。允许1/多个IFlow发送异常消息以启用EO重试。
第2点-验证调用IFlow是否传递RetryEndpoint和ErrorMessage标头,以确保可以正确处理错误。
第3点-根据配置的最大重试限制检查消息重试计数。如果达到限制,则消息将设置为升级状态,不进行进一步处理。
第4点-确定错误是在初始消息处理期间还是在重试期间。只有初始消息存储到JMS队列中。
第5点–将初始消息存储到JMS队列中。
第6点–如果消息在重试期间失败,则不会再次存储到JMS队列中,以防止重复条目。相反,它通过Groovy脚本被强制设置为"失败"状态,这将导致存储在JMS中的现有消息被重新安排下次重试。
第7点–消息将根据JMS发送方通道中的配置设置从JMS队列重试。
第8点–在重试期间设置头重试模式,因此,如果消息在重试期间再次失败,则可以在上面的第4点区分消息。
第9点–通过动态填充的RetryEndpoint标头将消息发送回目标IFlow来重试消息。