如何在 Mule 4 中通过 ActiveMQ 传递属性
Posted
技术标签:
【中文标题】如何在 Mule 4 中通过 ActiveMQ 传递属性【英文标题】:how to pass an attribute over ActiveMQ in Mule 4 【发布时间】:2021-03-30 04:38:11 【问题描述】:我们正在从 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 中达到同样的效果呢?
【问题讨论】:
【参考方案1】:出于多种原因,甚至不要尝试这样做。对于一个消息结构是不同的,所以输出属性不再存在,该方法甚至不存在。另一方面,在 Mule 4 中,像 Groovy 组件这样的组件只能返回一个值,而不能更改事件。他们无法决定要分配什么值。您可以在配置中设置目标(有效负载或变量)而不更改属性。请注意,Mule 4 中的变量由 var.
引用,而不是像在 Mule 3 中那样由 flowVars.
引用(即vars.idFromUI
)。
有一种更简单的方法可以在 Mule 4 JMS 连接器中设置消息属性。使用 properties 元素并将其传递给具有属性的对象。
例如,它可能是这样的:
<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。我从那里改编了我的例子。
【讨论】:
【参考方案2】:我不确定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
是一个标题。 queryParams 和 headers 都是 Mule 4 中属性的一部分。
【讨论】:
谢谢,这与解决我问题的早期答案相似,谢谢以上是关于如何在 Mule 4 中通过 ActiveMQ 传递属性的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Mule XA 事务中为 ActiveMQ 启用 RedeliveryDelay
如何在 ActiveMQ 中通过 Stomp/JSON 使用 JMS 消息转换