如何在 Mule 4 中通过 ActiveMQ 传递属性

how to pass an attribute over ActiveMQ in Mule 4

我们正在从 Mule 3 迁移到 Mule 4,在我们的一项功能中,我们需要将消息发布到一个主题,而下游的另一个 mule 组件正在从桥接到该主题的队列中消费。
这里没什么特别的。
为了确保我们能够通过日志跟踪流程,我们在向主题 (Mule 3)

发布消息时发送了一个 'TrackingId' 属性
message.setOutboundProperty("XYZ_TrackingID", flowVars['idFromUI']);
            return payload;

然而,当我在 Mule 4 中尝试相同的操作时,出现以下异常:

ERROR 2020-12-20 10:09:12,214 [[MuleRuntime].cpuIntensive.14: [mycomponent].my_Flow.CPU_INTENSIVE 
@66024695] org.mule.runtime.core.internal.exception.OnErrorPropagateHandler: 
Message : groovy.lang.MissingMethodException: No signature of method: 
org.mule.runtime.api.el.BindingContextUtils$MessageWrapper.setOutboundProperty() is applicable for 
argument types: (java.lang.String, org.mule.weave.v2.el.ByteArrayBasedCursorStream) values: 
[XYZ_TrackingID, "1234567"].\nError type            :   (set debug level logging or '- 
Dmule.verbose.exceptions=true' for 
everything)\n********************************************************************************

检查互联网,似乎在 Mule4 中设置出站属性已按照 here

删除

那么如何在 Mule 4 中实现同样的效果?

出于多种原因,甚至不要尝试这样做。因为一个消息结构不同,所以输出属性不再存在,该方法甚至不存在。另一方面,在 Mule 4 组件中,像 Groovy 组件只能 return 一个值,不能改变事件。他们无法决定该值将被分配给什么。您可以在配置(有效负载或变量)中设置目标而不更改属性。请注意,Mule 4 中的变量由 var. 引用,而不是像 Mule 3 中那样由 flowVars. 引用(即 vars.idFromUI)。

有一种更简单的方法可以在 Mule 4 JMS 连接器中设置消息属性。使用属性元素并将具有属性的对象传递给它。

例如它可能是这样的:

<jms:publish config-ref="JMS_config" destination="${bridgeDestination}" destinationType="TOPIC">
    <jms:message>
        <jms:body>#["bridged_" ++ payload]</jms:body>
        <jms:properties>#[{
            XYZ_TrackingID: vars.idFromUI
        }]</jms:properties>
    </jms:message>
</jms:publish>

它在文档中:https://docs.mulesoft.com/jms-connector/1.0/jms-publish#setting-user-properties。我从那里改编了我的例子。

我不确定 Correlation Id 是否为您的场景提供跟踪 ID。但是您可以按如下方式传递 CID。它在 mule 文档中。 https://docs.mulesoft.com/jms-connector/1.7/jms-publish

<jms:publish config-ref="JMS_config" sendCorrelationId="ALWAYS" destination="#[attributes.headers.replyTo.destination]">
    <jms:message correlationId="#[attributes.headers.correlationId]"/>
</jms:publish>

如果您的首要任务是自定义要发布的跟踪 ID,请尝试传递以下格式。密钥名称可能因您的用例而异。

<jms:publish config-ref="JMS_config" destination="${bridgeDestination}" destinationType="TOPIC">
    <jms:message>
        <jms:body>#["bridged_" ++ payload]</jms:body>
        <jms:properties>#[{
            AUTH_TYPE: 'jwt',
            AUTH_TOKEN: attributes.queryParams.token
        }]</jms:properties>
    </jms:message>
</jms:publish>

在上面的表达式 attributes.queryParams.token 中,基本上是尝试访问一个 token 查询参数,该参数作为 属性 AUTH_TOKEN key-name 传递给 JMS ,由 API 先前通过 HTTP 监听器或请求器使用。 然而,attributes.headers.correlationId 是一个 header。 queryParams 和 headers 都是 Mule 4 中属性的一部分。