2012-12-21 22 views
5

Ho una richiesta di sapone in arrivo nel flusso di mulo. Ho il compito di ottenere informazioni dal carico utile e, in base al risultato, spingere la richiesta originale a diverse code jms.Come posso sovrascrivere il carico utile in mulo

Per ottenere le informazioni desiderate dal carico utile, sto utilizzando il tranformer XSLT (non XPath, perché ho bisogno di ottenere l'attributo IDREF da un elemento, basato su IDREF, ottenere l'elemento e quindi un elemento figlio dall'IDREF oggetto).

Sulla base del risultato della trasformazione XSLT, utilizzo l'elemento choice per spingere il payload originale. Sto memorizzando il carico utile originale in una sessione (può farlo anche in entrata). Dopo l'elaborazione XSLT, applicare il router di scelta per individuare la coda appropriata e quindi inviare il payload originale in coda (carico utile originale memorizzato in una variabile di sessione). Sto usando l'elemento . Qui di seguito è il frammento di mulo-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> 

seguito viene generata un'eccezione quando si valutano payload = # [intestazione: SESSIONE: 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) 
******************************************************************************** 

Ho 2 domande:

  1. Come posso sovrascrivere il carico utile originale? (Non dire che questo è il modo migliore per andare)
  2. Qual è l'approccio migliore in questo scenario? È consigliabile mantenere intatto il payload originale (in questo caso) e archiviare l'output XSLT in un'altra variabile? Come lo posso fare? Qual è il percorso (componente del mulo) che posso usare per ottenerlo? Sono molto nuovo a Mule e cerco consigli sulla comunità.

Grazie per il vostro tempo a guardare in questo.

risposta

16

Prima di rispondere alle vostre domande, cerchiamo di riscrivere questa espressione rotto:

<expression-component>payload=#[header:SESSION:mviPayload]</expression-component> 

come:

<set-payload value="#[sessionVars.mviPayload]" /> 

Il seguente funzionerebbe troppo, ma sarebbe più complessa per nessuna buona ragione:

<expression-component>payload=sessionVars.mviPayload</expression-component> 

Anche questo:

<message-properties-transformer scope="session"> 
    <add-message-property key="mviPayload" value="#[payload]"/> 
</message-properties-transformer> 

sarebbe meglio scritto:

<set-session-variable variableName="mviPayload" value="#[message.payload]" /> 

Ora alle tue domande:

  1. Usa set-payload
  2. Quello che state facendo è la migliore: trasformatori, come XSL-T, si applica naturalmente al carico utile del messaggio corrente, in modo da salvare l'originale in una proprietà, quindi la trasformazione del carico utile principale è OK. Solo una cosa: preferisci una variabile di flusso invece di una variabile di sessione. Infatti, nel tuo caso, non penso che tu abbia bisogno del payload originale al di fuori di questo flusso, quindi l'archiviazione in sessione è eccessiva.

Quindi vi suggerisco di utilizzare:

<set-variable variableName="mviPayload" value="#[message.payload]" /> 

per memorizzare il payload originale e le seguenti operazioni per ristabilirla:

<set-payload value="#[mviPayload]" /> 
+0

funziona come un fascino. Grazie mille David –

+0

Esattamente quello di cui avevo bisogno. Grazie! Sembra così semplice ora che so come farlo. – SteveS

+5

Più mi mulo, più vedo che la maggior parte delle cose è piuttosto semplice una volta capito il modo corretto di farlo. Ho provato un milione di modi complicati per svolgere compiti semplici e la risposta è solitamente molto semplice – Aheinlein

0

Usa Set-Payload e di fornire i dati per essere sovrascritto.

+0

Fornisci un esempio e/o alcune informazioni di base. – m02ph3u5

-1

Si potrebbe fare questo con molti modi.

  1. Usa set-payload
  2. Usa espressione, # [payload = '']
  3. utilizzare un trasformatore/componente
Problemi correlati