सामग्री पर जाएँ
← ब्लॉग पर वापस जाएँ

इस लेख का मॉड्यूल: Integration Flow Helper

SAP CPI में Camel Simple expressions: headers, properties और ${…} उदाहरणों के साथ

SAP CPI में Camel Simple expressions कैसे काम करते हैं: ${header.x}, ${property.x}, ${in.body}, तारीखें, Content Modifier का क्रम, Router conditions और खाली नतीजा देने वाली गलतियाँ।

SAP CPI में Camel Simple expressions: headers, properties और ${…} उदाहरणों के साथ

SAP Cloud Integration (SAP CPI) के iFlow में लगभग हर dynamic value Apache Camel की Simple expression language में लिखी जाती है: receiver address में एक header, Content Modifier में एक property, file name में तारीख, Router पर एक condition। इसका syntax छोटा है, ${…}, और इसमें बिना ध्यान दिए थोड़ी-सी गलती हो जाना बहुत आसान है।

यह लेख उन expressions को समझाता है जो आप रोज़ इस्तेमाल करेंगे, वह क्रम जिसमें Content Modifier उन्हें evaluate करता है, headers और exchange properties का अंतर, और वे गलतियाँ जिनसे कोई expression चुपचाप कुछ भी नहीं लौटाता।

SAP CPI में Simple expression क्या है

SAP Integration Suite हर iFlow को Apache Camel पर चलाता है। जब कोई step चलता है, तो Camel field में मौजूद हर ${…} को मौजूदा message की किसी value से बदल देता है: एक header, एक exchange property, body, या कोई built-in function जैसे आज की तारीख। expression के आसपास का text जैसा है वैसा ही रहता है, इसलिए Order-${header.orderId}.xml बन जाता है Order-4711.xml।

आप Simple expressions को Content Modifier की Expression-type values और message body में, कई receiver adapters के address और query fields में, Router और Filter की Non-XML conditions में, और mail subject या SFTP file name जैसे fields में लिख सकते हैं। Externalized parameters देखने में मिलते-जुलते हैं, पर अलग चीज़ हैं: {{receiverHost}} deploy के समय सिर्फ़ एक बार बदला जाता है, जबकि ${…} हर message के लिए evaluate होता है।

रोज़ इस्तेमाल होने वाले expressions

कुछ ही expressions ज़्यादातर iFlows का काम चला देते हैं, और इन्हें text के साथ आसानी से मिलाया जा सकता है। उदाहरण के लिए, Content Modifier की body headers, properties और functions से पूरा XML document बना सकती है:

<Order>
  <Id>${property.orderId}</Id>
  <Customer>${header.customerId}</Customer>
  <ReceivedOn>${date:now:yyyy-MM-dd}</ReceivedOn>
  <Flow>${camelId}</Flow>
  <MessageLog>${property.SAP_MessageProcessingLogID}</MessageLog>
</Order>
Expressionक्या लौटाता है
${header.orderId}message header orderId
${property.orderId}exchange property orderId (Camel ${exchangeProperty.orderId} भी स्वीकार करता है)
${in.body} या ${body}मौजूदा message body, text के रूप में
${date:now:yyyy-MM-dd}आज की तारीख, दिए गए Java date pattern में
${camelId}चल रहे integration flow का नाम
${property.SAP_MessageProcessingLogID}मौजूदा message processing log की ID
${header.CamelHttpResponseCode}पिछली HTTP call से लौटा status code

Content Modifier headers, properties और body को कैसे evaluate करता है

Content Modifier अपने tabs को एक तय क्रम में चलाता है: पहले Message Header table, फिर Exchange Property table, फिर Message Body। हर table के अंदर rows ऊपर से नीचे चलती हैं।

यही क्रम तय करता है कि कोई expression क्या देख सकता है। property row उसी Content Modifier में पहले बने header को पढ़ सकती है, और body दोनों का इस्तेमाल कर सकती है। header row उसी Content Modifier में बनने वाली property को नहीं पढ़ सकती, क्योंकि header evaluate होते समय वह property अभी मौजूद ही नहीं होती; उसकी जगह उसे खाली value मिलती है। अगर आपको ऐसा चाहिए, तो property किसी पहले वाले Content Modifier में सेट करें, या value को header table में ले जाएँ, जो पहले चलती है।

  • Source type Expression: value एक Simple expression होती है, जैसे ${date:now:yyyyMMdd}-${header.orderId}।
  • Source type Header या Property: किसी दूसरे header या property को नाम से copy करता है, आसपास ${…} के बिना।
  • Source type XPath: XML body से value पढ़ता है (नीचे दिया गया XPath लेख देखें)।
  • Constant, Local Variable, Global Variable और Number Range source types fixed और stored values के लिए हैं।

Header या exchange property: कौन-सा इस्तेमाल करें

header message के साथ यात्रा करता है। Receiver adapters headers को उस system तक भेज सकते हैं जिसे आप call करते हैं, और headers ProcessDirect call से दूसरे iFlow तक पहुँचते हैं। exchange property मौजूदा iFlow के exchange के अंदर ही रहती है और अपने-आप किसी receiver को कभी नहीं भेजी जाती।

ज़्यादातर उलझनें दो बातों से आती हैं। Header के नाम case-insensitive होते हैं, इसलिए ${header.OrderID} और ${header.orderid} एक ही header पढ़ते हैं। Exchange property के नाम case-sensitive होते हैं, इसलिए ${property.OrderID} और ${property.orderId} दो अलग properties हैं, और हो सकता है दूसरी मौजूद ही न हो।

  • जिन values की ज़रूरत सिर्फ़ इसी iFlow को है, उनके लिए property इस्तेमाल करें: IDs, counters, flags, payload की सहेजी गई copies।
  • जिन values को किसी adapter या अगले iFlow तक पहुँचना है, उनके लिए header इस्तेमाल करें, और जो headers tenant से बाहर नहीं जाने चाहिए उन्हें हटा दें।
  • बड़ी values headers में न रखें: वे हर call के साथ जाती हैं।

Router और Filter में Simple conditions

Router route या Non-XML Filter में condition एक Simple expression होती है, जिसकी तुलना किसी value से की जाती है। आम operators हैं =, !=, >, >=, <, <=, contains, in और regex, जिन्हें and या or से जोड़ा जाता है। Text values single quotes में लिखी जाती हैं:

${header.orderType} = 'EXPRESS'
${property.amount} > 1000 and ${header.country} in 'DE,AT,CH'
${header.CamelHttpResponseCode} != '200'

अगर condition में इस्तेमाल हुआ header या property मौजूद नहीं है, तो condition बस false हो जाती है और message कोई दूसरा route ले लेता है, अक्सर default route। अज्ञात headers और properties वाला लेख बताता है कि production तक पहुँचने से पहले इसे कैसे पकड़ें।

Kitegra कैसे मदद करता है

Kitegra SAP Integration Suite डिज़ाइनर के लिए एक browser एक्सटेंशन है। डिज़ाइनर के किसी field में ${ या $ लिखें, और यह iFlow के उस बिंदु पर फ़िट होने वाले नाम दिखाता है: Content Modifiers, Groovy और JavaScript scripts और iFlow में दूसरी जगहों पर सेट किए गए headers और properties, SAP और Camel के standard headers और expressions, {{…}} parameters, variables और Data Store के नाम। जो नाम सिर्फ़ कुछ paths पर सेट होता है, उस पर "केवल कुछ पाथ पर सेट" का निशान लगा होता है।

इसका lint panel बंद न किए गए ${, expression के अंदर फ़ालतू spaces, और ऐसे headers या properties को चिह्नित करता है जिन्हें iFlow में कुछ भी सेट नहीं करता। XPath rows के लिए sample payload से path सुझाव भी मिलते हैं, जैसा XPath वाला लेख बताता है। एक्सटेंशन किसी iFlow का content कभी सहेजता, deploy या edit नहीं करता, और आपका tenant सिर्फ़ तब बदलता है जब आप चार नामित actions में से किसी एक पर क्लिक करते हैं, जिन्हें बंद भी किया जा सकता है।

आपके expressions असल में कौन-सी values बनाते हैं, यह देखने के लिए किसी message को step by step trace करें और हर step से पहले के headers और properties पढ़ें।

Kitegra खाते के बिना यह हर मॉड्यूल में 5 iFlows पर काम करता है। Free प्लान में 50, Starter में 100 और Pro में 300 iFlows शामिल हैं। टीम प्लान पर हर सदस्य को Pro मिलता है, Startup Team पर हर मॉड्यूल में 300 iFlows के साथ, और Growth Team और Scale Team पर कोई सीमा नहीं। Kitegra के लॉन्च के दौरान, साइन इन किए हर व्यक्ति के लिए हर टूल खुला है, Free प्लान पर भी। प्लान की तुलना करें।

अपने अगले iFlow में आज़माएँ

पढ़ें कि Kitegra, SAP Integration Suite के डिज़ाइनर में क्या करता है, या इसे Kitegra के बाकी Chrome एक्सटेंशन के साथ देखें।

अक्सर पूछे जाने वाले प्रश्न

SAP CPI में ${header.x} और ${property.x} में क्या अंतर है?

${header.x} एक message header पढ़ता है, जो message के साथ यात्रा करता है और receivers और दूसरे iFlows तक पहुँच सकता है। ${property.x} एक exchange property पढ़ता है, जो मौजूदा iFlow के अंदर ही रहती है।

क्या header और property के नाम case-sensitive होते हैं?

Header के नाम नहीं: ${header.OrderID} और ${header.orderid} एक ही header पढ़ते हैं। Exchange property के नाम होते हैं, इसलिए ${property.OrderID} और ${property.orderId} अलग-अलग properties हैं।

उसी Content Modifier में property से सेट करने पर मेरा header खाली क्यों रहता है?

Content Modifier पहले header table, फिर property table और फिर body evaluate करता है। header उसी step में बनी property को नहीं पढ़ सकता; property को किसी पहले वाले step में सेट करें।

File name या field में आज की तारीख कैसे डालें?

${date:now:yyyy-MM-dd} को किसी भी Java date pattern के साथ इस्तेमाल करें, जैसे timestamp के लिए ${date:now:yyyyMMddHHmmss}।

क्या {{parameter}} एक Simple expression है?

नहीं। {{…}} एक externalized parameter को दर्शाता है, जो deploy के समय सिर्फ़ एक बार बदला जाता है। ${…} को Camel हर message के लिए evaluate करता है।

अगर expression किसी ऐसे header का नाम ले जो मौजूद नहीं है, तो क्या होता है?

यह बिना किसी error के खाली value लौटाता है, इसलिए समस्या बाद में गलत route या खाली field के रूप में दिखती है। Lint जाँच या कोई guard step इसे पहले पकड़ लेता है।

डिज़ाइनर छोड़े बिना iFlows पर काम करें

Kitegra को Chrome या Microsoft Edge में जोड़ें। मुफ़्त में शुरू करें, किसी खाते की ज़रूरत नहीं।