WSO2 ESB:header 设置于 "in sequence" 丢失于 "out sequence"
WSO2 ESB: header set in "in sequence" lost in "out sequence"
我在 WSO2 中遇到消息调解的大问题。事情是这样的。
在我的序列中,我在我的消息中设置了一个传输 header,包含 messageID,这样:
<property name="MediationMessageId" scope="transport" expression="get-property('MessageID')"/>
现在,我想在后序中访问这个 属性。但是当我尝试在我的 payloadFactory 中访问它时,我得到的只是一个空字符串:
<payloadFactory media-type="json">
<format>{"mediationmessageid": ""}</format>
<args>
<arg evaluator="xml" expression="$ctx:MediationMessageId"/>
</args>
</payloadFactory>
结果:
{"mediationmessageid": ""}
我是不是做错了什么?
非常感谢
编辑:输入序列和输出序列在 2 个单独的文件中。不知道会不会有影响。
您的 属性 在正常范围内,而不在传输范围内(消息 headers 等所在的范围),因此您应该像这样访问它:
$ctx:MediationMessageId
还有一个拼写错误,您在尝试使用全小写访问时使用 CamelCase 定义了 属性:)
使用 call 或 send mediator 调用后端服务后,传输 header 将消失。后端在响应中设置它自己的传输(响应)headers。
如果您希望您的值在 call/send 中介之后仍然可用,您需要在例如 Synapse(默认范围)处设置它。这存在于整个事务中。您可以将 'default' 指定为范围,也可以根本不指定,它将设置为 Synapse。
如果您还需要 属性 作为传输 header 与您的消息一起发送(这是传输范围的作用),您将必须设置它两次。一次在默认范围内,一次作为传输 header。例如:
<property name="X-MediationMessageId" scope="transport" expression="get-property('MessageID')"/>
<property name="MediationMessageId" scope="default" expression="get-property('MessageID')"/>
然后检索然后使用:
<payloadFactory media-type="json">
<format>{"mediationmessageid": ""}</format>
<args>
<arg evaluator="xml" expression="$ctx:MediationMessageId"/>
</args>
</payloadFactory>
有关范围检查的更多信息wso2 documentation
好吧,历尽千辛万苦,我终于战胜了怪物
以下是序列的工作配置:
<property expression="get-property('MessageID')" name="MediationMessageId" scope="default" type="STRING"/>
还有一个用于输出序列:
<payloadFactory media-type="json">
<format>{"MediationMessageId": ""}</format>
<args>
<arg evaluator="xml" expression="get-property('default', 'MediationMessageId')"/>
</args>
</payloadFactory>
这只是对属性范围的混淆...
感谢所有阅读并思考过这个问题的人。
我在 WSO2 中遇到消息调解的大问题。事情是这样的。
在我的序列中,我在我的消息中设置了一个传输 header,包含 messageID,这样:
<property name="MediationMessageId" scope="transport" expression="get-property('MessageID')"/>
现在,我想在后序中访问这个 属性。但是当我尝试在我的 payloadFactory 中访问它时,我得到的只是一个空字符串:
<payloadFactory media-type="json">
<format>{"mediationmessageid": ""}</format>
<args>
<arg evaluator="xml" expression="$ctx:MediationMessageId"/>
</args>
</payloadFactory>
结果:
{"mediationmessageid": ""}
我是不是做错了什么?
非常感谢
编辑:输入序列和输出序列在 2 个单独的文件中。不知道会不会有影响。
您的 属性 在正常范围内,而不在传输范围内(消息 headers 等所在的范围),因此您应该像这样访问它:
$ctx:MediationMessageId
还有一个拼写错误,您在尝试使用全小写访问时使用 CamelCase 定义了 属性:)
使用 call 或 send mediator 调用后端服务后,传输 header 将消失。后端在响应中设置它自己的传输(响应)headers。
如果您希望您的值在 call/send 中介之后仍然可用,您需要在例如 Synapse(默认范围)处设置它。这存在于整个事务中。您可以将 'default' 指定为范围,也可以根本不指定,它将设置为 Synapse。
如果您还需要 属性 作为传输 header 与您的消息一起发送(这是传输范围的作用),您将必须设置它两次。一次在默认范围内,一次作为传输 header。例如:
<property name="X-MediationMessageId" scope="transport" expression="get-property('MessageID')"/>
<property name="MediationMessageId" scope="default" expression="get-property('MessageID')"/>
然后检索然后使用:
<payloadFactory media-type="json">
<format>{"mediationmessageid": ""}</format>
<args>
<arg evaluator="xml" expression="$ctx:MediationMessageId"/>
</args>
</payloadFactory>
有关范围检查的更多信息wso2 documentation
好吧,历尽千辛万苦,我终于战胜了怪物
以下是序列的工作配置:
<property expression="get-property('MessageID')" name="MediationMessageId" scope="default" type="STRING"/>
还有一个用于输出序列:
<payloadFactory media-type="json">
<format>{"MediationMessageId": ""}</format>
<args>
<arg evaluator="xml" expression="get-property('default', 'MediationMessageId')"/>
</args>
</payloadFactory>
这只是对属性范围的混淆...
感谢所有阅读并思考过这个问题的人。