我在WSO2中的消息中介方面遇到了很大的问题。这是东西。
在这种情况下,我在邮件中设置了一个传输头,其中包含messageID,方法是:
<property name="MediationMessageId" scope="transport" expression="get-property('MessageID')"/>
现在,我想按顺序访问此属性。但是,当我尝试在我的payloadFactory中访问它时,我所得到的只是一个空字符串:
<payloadFactory media-type="json">
<format>{"mediationmessageid": "$1"}</format>
<args>
<arg evaluator="xml" expression="$ctx:MediationMessageId"/>
</args>
</payloadFactory>
结果:
{"mediationmessageid": ""}
我做错什么了吗?
非常感谢
编辑:输入顺序和输出顺序在2个单独的文件中。不知道这是否会产生影响。
答案 0 :(得分:1)
使用呼叫或发送介体呼叫后端服务后,传输头将消失。后端在响应上设置它自己的传输(响应)标头。
如果您希望您的值在呼叫/发送中介之后仍然可用,则需要在例如Synapse(默认范围)上进行设置。这对于整个交易都是存在的。您可以将“默认”指定为作用域,也可以完全不指定,它将被设置为Synapse。
如果还需要将该属性与消息一起作为传输头发送(这是传输范围所要做的),则必须将其设置两次。一次在默认范围内,一次作为传输头。例如:
<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": "$1"}</format>
<args>
<arg evaluator="xml" expression="$ctx:MediationMessageId"/>
</args>
</payloadFactory>
有关范围检查的更多信息,wso2 documentation
答案 1 :(得分:1)
好多汗水和眼泪之后,我终于击败了怪物。
以下是按顺序工作的配置:
<property expression="get-property('MessageID')" name="MediationMessageId" scope="default" type="STRING"/>
还有一个用于out序列:
<payloadFactory media-type="json">
<format>{"MediationMessageId": "$1"}</format>
<args>
<arg evaluator="xml" expression="get-property('default', 'MediationMessageId')"/>
</args>
</payloadFactory>
这只是对属性范围的混淆...
感谢所有阅读并对此问题有想法的人。
答案 2 :(得分:0)
您的属性在正常范围内,而不是在传输范围(消息标头等所在的位置)内,因此您应该像这样访问它:
$ctx:MediationMessageId
还有一个错字,您尝试使用所有小写字母时用CamelCase定义了属性:)