我正在进入骡子流的肥皂请求。我的任务是从有效负载中获取信息,并根据结果将原始请求推送到不同的jms队列。
为了从有效负载中获取所需信息,我使用的是XSLT转换器(不是XPath,因为我需要从一个元素获取IDREF属性,基于IDREF,获取元素,然后获取子元素IDREF对象)。
基于XSLT转换的结果,我使用choice元素来推送原始有效负载。我将原始有效负载存储在会话中(也可以在入站中执行)。在XSLT转换后,应用选择路由器以找出适当的队列,然后将原始有效负载推入队列(存储在会话变量中的原始有效负载)。我正在使用<expression-component>
元素。下面是mule-flow的片段:
<flow name="ProcessXML121Order">
<jms:inbound-endpoint queue="mviq.121.order" exchange-pattern="one-way" />
<logger message="121 order payload is #[payload]" level="INFO" />
<message-properties-transformer scope="session">
<add-message-property key="mviPayload" value="#[payload]"/>
</message-properties-transformer>
<xm:xslt-transformer xsl-file="chooseVendor.xslt" />
<logger message="After xsl file payload is #[payload]" level="INFO" />
<choice>
<when expression="'EMSI'">
<logger message="Vendor is EMSI" level="INFO" />
<expression-component>payload=#[header:SESSION:mviPayload]</expression-component>
<jms:outbound-endpoint queue="mviq.121.order.emsi" />
</when>
<when expression="'PRMD'">
<logger message="Vendor is PRMD" level="INFO" />
<jms:outbound-endpoint queue="mviq.121.order.prmd" />
</when>
<when expression="'RSA'">
<logger message="Vendor is RSA" level="INFO" />
<logger message="RSA payload is #[payload]" level="INFO" />
<jms:outbound-endpoint queue="mviq.121.order.rsa" />
</when>
<otherwise>
<logger message="Vendor is Error" level="INFO" />
<logger message="Vendor error payload is #[payload]" level="INFO" />
<jms:outbound-endpoint queue="mviq.error" />
</otherwise>
</choice>
</flow>
在评估payload =#[header:SESSION:mviPayload]
时抛出以下异常[ProcessXML121Order.stage1.02] exception.AbstractExceptionListener (AbstractExceptionListener.java:296) -
********************************************************************************
Message : Execution of the expression "payload=#[header:SESSION:mviPayload]" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: byte[]
Code : MULE_ERROR-29999
--------------------------------------------------------------------------------
Exception stack is:
1. [Error: illegal use of operator: +]
[Near : {... Unknown ....}]
^
[Line: 1, Column: 0] (org.mvel2.CompileException)
org.mvel2.ast.OperatorNode:46 (null)
2. Execution of the expression "payload=#[header:SESSION:mviPayload]" failed. (org.mule.api.expression.ExpressionRuntimeException)
org.mule.el.mvel.MVELExpressionLanguage:211 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/expression/ExpressionRuntimeException.html)
3. Execution of the expression "payload=#[header:SESSION:mviPayload]" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: byte[] (org.mule.api.MessagingException)
org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor:35 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MessagingException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
[Error: illegal use of operator: +]
[Near : {... Unknown ....}]
^
[Line: 1, Column: 0]
at org.mvel2.ast.OperatorNode.getReducedValueAccelerated(OperatorNode.java:46)
at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:105)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************
我有两个问题:
感谢您抽出时间研究这个问题。
答案 0 :(得分:16)
在回答你的问题之前,让我们重写这个破碎的表达:
<expression-component>payload=#[header:SESSION:mviPayload]</expression-component>
为:
<set-payload value="#[sessionVars.mviPayload]" />
以下内容也可行,但没有充分理由会更复杂:
<expression-component>payload=sessionVars.mviPayload</expression-component>
还有:
<message-properties-transformer scope="session">
<add-message-property key="mviPayload" value="#[payload]"/>
</message-properties-transformer>
写得更好:
<set-session-variable variableName="mviPayload" value="#[message.payload]" />
现在回答你的问题:
set-payload
所以我建议你使用:
<set-variable variableName="mviPayload" value="#[message.payload]" />
存储原始有效负载和以下内容以重新建立它:
<set-payload value="#[mviPayload]" />
答案 1 :(得分:0)
使用Set-Payload并提供要覆盖的数据。
答案 2 :(得分:0)
你可以用很多方法做到这一点。
答案 3 :(得分:0)
您可以保持有效负载完整,并使用消息扩充器将xslt转换的值存储在变量中。使用里面的变量来确定要转到的队列。以下是代码段
<enricher doc:name="Message Enricher" target="#[flowVars.transformResultVar]">
<!--perform transformation logic here-->
</enricher>
参考:https://dzone.com/articles/content-enrichment-using-mule-message-enricher-com