2012-12-21 11 views
5

में पेलोड को ओवरराइट कैसे कर सकता हूं मेरे पास एक साबुन अनुरोध है जो खच्चर प्रवाह में आ रहा है। मुझे पेलोड से जानकारी प्राप्त करने और परिणाम के आधार पर कार्य करने के लिए जिम्मेदार ठहराया गया है, मूल अनुरोध को विभिन्न जेएम कतारों पर धक्का दें।मैं mule

पेलोड से वांछित जानकारी प्राप्त करने के लिए, मैं एक्सएसएलटी ट्रैनफॉर्मर का उपयोग कर रहा हूं (XPath नहीं, क्योंकि मुझे आईडीआरईएफ के आधार पर किसी तत्व से आईडीआरईएफ विशेषता प्राप्त करने की आवश्यकता है, तत्व प्राप्त करें और उसके बाद आईडीआरएफ से एक बच्चा तत्व प्राप्त करें वस्तु)।

एक्सएसएलटी ट्रांज़ॉर्मेशन के नतीजे के आधार पर, मैं मूल पेलोड को धक्का देने के लिए पसंद तत्व का उपयोग करता हूं। एक सत्र में मूल पेलोड संग्रहीत कर रहा हूं (इसे इनबाउंड में भी कर सकता है)। एक्सएसएलटी टैन्सफॉर्मेशन के बाद, उपयुक्त कतार का पता लगाने के लिए विकल्प राउटर लागू करें, और फिर मूल पेलोड को कतार में धक्का देना चाहते हैं (एक सत्र चर में संग्रहीत मूल पेलोड)। मैं <expression-component> तत्व का उपयोग कर रहा हूं। नीचे खच्चर-प्रवाह का टुकड़ा है: जब पेलोड का मूल्यांकन

<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> 

बाद अपवाद फेंक दिया जाता है = # [हैडर: सत्र: 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) 
    ******************************************************************************** 
    

    2 सवाल है

  1. मैं मूल पेलोड को कैसे ओवरराइट कर सकता हूं? (यह नहीं कह रहा कि यह जाने का सबसे अच्छा तरीका है)
  2. इस परिदृश्य में बेहतर दृष्टिकोण क्या है? क्या यह मूल पेलोड बरकरार रखने के लिए सलाह दी जाती है (इस मामले में) और अन्य चर में एक्सएसएलटी आउटपुट स्टोर करें? मैं उसे कैसे कर सकता हूँ? पथ (खंभे घटक) क्या है जिसे मैं प्राप्त करने के लिए उपयोग कर सकता हूं? मैं मुले के लिए बहुत नया हूं और सामुदायिक सलाह लेता हूं।

आपके समय के लिए धन्यवाद।

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

के रूप में:

उत्तर

16

आपके प्रश्नों का उत्तर पहले, चलो इस टूटी हुई अभिव्यक्ति को फिर से लिखने जाने

<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]" /> 

अब अपने प्रश्नों के: ट्रांसफॉर्मर, XSL-टी की तरह, स्वाभाविक रूप से लागू होता है:

  1. उपयोग set-payload
  2. क्या आप कर रहे हैं सबसे अच्छा है वर्तमान संदेश पेलोड के लिए एक संपत्ति में मूल को सहेजना, फिर मुख्य पेलोड को बदलना ठीक है। बस एक चीज: एक सत्र चर के बजाय प्रवाह चर पसंद करते हैं। दरअसल, आपके मामले में, मुझे नहीं लगता कि आपको इस प्रवाह के बाहर मूल पेलोड की आवश्यकता है, इसलिए सत्र में संग्रहीत करना अधिक है।

तो मैं आप का उपयोग करने का सुझाव:

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

मूल पेलोड स्टोर करने के लिए और करने के लिए निम्न यह फिर से स्थापित:

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

वर्क्स एक आकर्षण की तरह। बहुत बहुत धन्यवाद डेविड –

+0

बिल्कुल वही मुझे जो चाहिए वह भी। धन्यवाद! अब इतना आसान लगता है कि मुझे पता है कि यह कैसे करें। – SteveS

+5

जितना अधिक मैं खंभे में आता हूं, उतना ही मैं देखता हूं कि इसे करने के सही तरीके से पता लगाने के बाद ज्यादातर चीजें बहुत सरल होती हैं। मैंने सरल कार्यों को पूरा करने के लिए दस लाख जटिल तरीकों का प्रयास किया है और उत्तर आमतौर पर बहुत आसान है – Aheinlein

0

उपयोग सेट पेलोड और होना करने के लिए डेटा उपलब्ध कराने के ओवरराइट।

+0

कृपया एक उदाहरण और/या कुछ पृष्ठभूमि जानकारी प्रदान करें। – m02ph3u5

-1

आप इसे कई तरीकों से कर सकते हैं।

  1. उपयोग सेट पेलोड
  2. उपयोग अभिव्यक्ति, # [पेलोड = '']
  3. उपयोग एक ट्रांसफार्मर/घटक