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

如何在Mule 4中通过ActiveMQ传递属性,mule,jms,activemq,Mule,Jms,Activemq,我们正在从Mule 3迁移到Mule 4,在我们的一项功能中,我们需要将消息发布到一个主题,而下游另一个Mule组件正在从连接到主题的队列中使用。 这里没什么特别的。 为了确保能够通过日志跟踪流,我们在向主题发布消息时发送了一个“TrackingId”属性(Mule 3) 但是,当我在Mule 4中尝试相同的方法时,我们得到以下异常: ERROR 2020-12-20 10:09:12,214 [[MuleRuntime].cpuIntensive.14: [mycomponent].my_Fl

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

但是,当我在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********************************************************************************
检查了internet,似乎在Mule4中设置出站属性已根据删除


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

出于几个原因,请不要尝试这样做。因为一个消息结构不同,所以输出属性不再存在,并且该方法甚至不存在。另一方面,在Mule 4中,Groovy组件只能返回一个值,不能更改事件。他们无法决定将分配什么值。您可以在配置中设置目标(有效负载或变量),而不更改属性。请注意,Mule 4中的变量由
var.
引用,而不是由
flowVars.
引用,如Mule 3中的变量(即
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>

#[“桥接”++有效负载]
#[{
XYZ_TrackingID:vars.idFromUI
}]

它在文档中:。我从那里改编了我的示例。

我不确定
相关Id
是否适用于您的场景的跟踪Id。但您可以按如下方式传递CID。在骡子的文件里。


如果您的首要任务是自定义要发布的跟踪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>

#[“桥接”++有效负载]
#[{
身份验证类型:“jwt”,
身份验证令牌:attributes.queryParams.TOKEN
}]
在上面的表达式中,
attributes.queryParams.token
基本上是试图访问
token
查询参数,该参数作为属性
AUTH_token
键名传递给JMS,由API通过HTTP侦听器或请求者使用。
但是,
attributes.headers.correlationId
是一个头。queryParams和Header都是Mule 4中属性的一部分。

谢谢你,这与前面解决我问题的答案类似,谢谢
<jms:publish config-ref="JMS_config" sendCorrelationId="ALWAYS" destination="#[attributes.headers.replyTo.destination]">
    <jms:message correlationId="#[attributes.headers.correlationId]"/>
</jms:publish>
<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>