跳到主要内容
← 返回博客

本文涉及的模块: Integration Flow Helper

SAP CPI 中的 ProcessDirect 与 JMS:如何在 iFlow 之间传递 header

如何在 SAP CPI 中通过 ProcessDirect 和 JMS 在 iFlow 之间传递 header 和 exchange property:匹配的地址和队列、哪些内容能传过去,以及如何排查问题。

SAP CPI 中的 ProcessDirect 与 JMS:如何在 iFlow 之间传递 header

SAP CPI 中的大型集成会拆分为多个 iFlow:一个负责接收,其他负责扩充、映射或发送。ProcessDirect 直接调用同一 tenant 中的另一个 iFlow;JMS 则把消息放进队列,由另一个 iFlow 稍后读取。两种情况下的问题都一样:我的哪些 header 和属性能到达另一端?

本文说明这两种连接如何配置、哪些内容能传过去、哪些不能,以及如何查明某个值为什么在两个 iFlow 之间丢失。

ProcessDirect:一个 iFlow 调用另一个

发起调用的 iFlow(生产者)使用 ProcessDirect 接收方适配器。被调用的 iFlow(消费者)以 ProcessDirect 发送方适配器开始。两者都有 Address 字段,只有两端的地址完全相同时调用才能连通,例如:

Producer iFlow  ->  ProcessDirect receiver   Address: /orders/enrich
Consumer iFlow  <-  ProcessDirect sender     Address: /orders/enrich

两个 iFlow 运行在同一个 tenant 中,消费者必须先部署,生产者才能调用它。一个地址上只能有一个已部署的消费者在监听。如果与 Request-Reply 步骤一起使用,消费者的最终消息会作为响应返回给生产者。

ProcessDirect 能传递什么、不能传递什么

消费者会收到消息体和消息 header。exchange property 会被留下:消费者会开始一个新的 exchange,其中没有生产者的任何属性。

要传递属性,请在调用之前用 Content Modifier 把它复制到 header 中,例如一个源类型为 Property、值为 orderId 的 header orderId。如果你在消费者中更习惯使用属性,可以在那里再把它复制回属性。删除消费者不应接收的 header,尤其是体积较大的 header。

JMS:通过队列传递消息

使用 JMS 时,生产者的 JMS 接收方适配器把消息写入队列,消费者 iFlow 则通过使用相同 Queue Name 的 JMS 发送方适配器读取它。两个 iFlow 因此解耦:生产者无需等待,消费者会重试失败的消息。

  • header 与消息一起存储,并会到达消费者。
  • exchange property 不会被存储,除非在 JMS 接收方上启用了 Transfer Exchange Properties。
  • 与消息一起存储的所有内容都有大小限制,因此请让 header 和传递的属性保持精简。
  • 在消费者中,header SAPJMSRetries 会告诉你该消息已经重试了多少次。

并排比较

ProcessDirectJMS
iFlow 之间的链接两端使用相同的 Address两端使用相同的 Queue Name
调用方式直接调用,可以返回响应异步,经由队列
消息体传递传递
header传递传递
exchange property不传递:请复制到 header 中仅在启用 Transfer Exchange Properties 时传递

header 名称在两端都不区分大小写,但 exchange property 名称区分大小写,因此在消费者中恢复的属性,其拼写必须与后续步骤读取它时完全一致。

当某个值没有到达时

  1. 逐字符比较地址或队列名称,包括开头的斜杠和大小写。
  2. 确认消费者已部署并已启动。
  3. 检查该值是否是属性:通过 ProcessDirect 它永远不会到达;通过 JMS,只有在启用 Transfer Exchange Properties 时才会到达。
  4. 确认没有 Content Modifier 在生产者出口处删除该 header。
  5. 将两个 iFlow 的日志级别设为 Trace 并运行,比较生产者最后一步与消费者第一步的 header。

关于未知 header 和属性的文章介绍了通用的检查方法,SAP CPI 中的 Camel Simple 表达式则介绍了读取这些值的语法。

Kitegra 如何帮你

浏览器扩展 Kitegra 会跟踪 iFlow 之间的 ProcessDirect 和 JMS 链接。在消费者中输入 ${ 或 $ 时,它会提示相连 iFlow 设置的 header 以及它们共享的链接名称,因此你无需打开生产者去核对拼写。

它的导航器会按每个 SAP 账户列出你的 tenant、package 和 iFlow,让你可以从链接的一端跳到另一端。它从不保存、部署或编辑 iFlow 的内容;只有在你点击四个指定操作之一时,tenant 才会发生变化,而且这些操作可以关闭。

要从生产者一路追踪一条消息到消费者,请按 Correlation ID 查找它:时间线会列出它经过的每个 iFlow。

没有 Kitegra 账户时,每个模块可用于 5 个 iFlow。Free 套餐涵盖 50 个,Starter 100 个,Pro 300 个;Business 不限。比较各套餐。

在下一个 iFlow 中试试

了解 Kitegra 在 SAP Integration Suite 设计器中能做什么,或在 Kitegra 的其他 Chrome 扩展旁查看它。

常见问题

在 SAP CPI 中,header 会通过 ProcessDirect 传递吗?

会。消费者 iFlow 会收到消息体和 header。exchange property 不会传递。

如何通过 ProcessDirect 把 exchange property 传给另一个 iFlow?

在 ProcessDirect 调用之前用 Content Modifier 把它复制到 header 中;如果在消费者中需要,再把它复制回属性。

为什么我的 ProcessDirect 调用连不上?

地址不一致(哪怕只差一个字符或一个斜杠),或者消费者 iFlow 没有部署在同一个 tenant 中。

JMS 会保留 exchange property 吗?

只有在 JMS 接收方适配器上启用了 Transfer Exchange Properties 时才会保留。header 总是与消息一起存储。

如何知道一条 JMS 消息被重试了多少次?

在消费者 iFlow 中读取 header SAPJMSRetries,例如在达到一定次数后停止重试。

两个 iFlow 可以监听同一个 ProcessDirect 地址吗?

不可以。一个地址只能由一个已部署的消费者使用;请为每个消费者分配各自的地址。

无需离开设计器即可处理 iFlow

将 Kitegra 添加到 Chrome 或 Microsoft Edge。免费开始,无需账户。