مواد پر جائیں
← بلاگ پر واپس جائیں

اس مضمون کا ماڈیول: Integration Flow Helper

SAP CPI میں Camel Simple Expressions: headers، properties اور ${…} مثالوں کے ساتھ

SAP CPI میں Camel Simple expressions کیسے کام کرتے ہیں: ${header.x}، ${property.x}، ${in.body}، تاریخیں، Content Modifier کی ترتیب، Router کی شرائط اور وہ غلطیاں جو کچھ واپس نہیں کرتیں۔

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، فائل کے نام میں تاریخ، یا Router پر کوئی شرط۔ اس کا syntax مختصر ہے، ${…}، اور اس میں بغیر محسوس کیے چھوٹی سی غلطی کر دینا آسان ہے۔

یہ مضمون ان expressions کا احاطہ کرتا ہے جو آپ روزانہ استعمال کریں گے، وہ ترتیب جس میں Content Modifier انہیں evaluate کرتا ہے، headers اور exchange properties کا فرق، اور وہ غلطیاں جن کی وجہ سے کوئی expression خاموشی سے خالی value واپس کرتا ہے۔

SAP CPI میں Simple expression کیا ہے

SAP Integration Suite ہر iFlow کو Apache Camel پر چلاتا ہے۔ جب کوئی step چلتا ہے تو Camel، field میں موجود ہر ${…} کو موجودہ message کی کسی value سے بدل دیتا ہے: ایک header، ایک exchange property، body، یا کوئی built-in function جیسے موجودہ تاریخ۔ expression کے ارد گرد کا متن جوں کا توں رہتا ہے، اس لیے Order-${header.orderId}.xml بن جاتا ہے Order-4711.xml۔

آپ Simple expressions کو Expression قسم کی Content Modifier values اور message body میں، بہت سے receiver adapters کے address اور query fields میں، Non-XML قسم کی Router اور Filter شرائط میں، اور mail subject یا SFTP فائل نام جیسے fields میں لکھ سکتے ہیں۔ Externalized parameters دیکھنے میں ملتے جلتے ہیں لیکن مختلف ہیں: {{receiverHost}} صرف ایک بار، iFlow ڈپلائے کرتے وقت، بدلا جاتا ہے، جبکہ ${…} ہر message کے لیے evaluate ہوتا ہے۔

وہ expressions جو آپ روزانہ استعمال کریں گے

چند expressions زیادہ تر iFlows کے لیے کافی ہیں، اور یہ عام متن کے ساتھ آزادانہ ملائے جا سکتے ہیں۔ مثلاً Content Modifier کی body، headers، properties اور functions سے پوری XML دستاویز بنا سکتی ہے:

<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، متن کی صورت میں
${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 ٹیبل، پھر Exchange Property ٹیبل، پھر Message Body۔ ہر ٹیبل کے اندر rows اوپر سے نیچے چلتی ہیں۔

یہی ترتیب طے کرتی ہے کہ کوئی expression کیا دیکھ سکتا ہے۔ property کی row اسی Content Modifier میں پہلے بنایا گیا header پڑھ سکتی ہے، اور body دونوں استعمال کر سکتی ہے۔ header کی row ایسی property نہیں پڑھ سکتی جو یہی Content Modifier بناتا ہے، کیونکہ header کے evaluate ہونے کے وقت وہ property ابھی موجود نہیں ہوتی؛ اس کی جگہ خالی value پڑھی جاتی ہے۔ اگر آپ کو ایسا کرنا ہو تو property کسی پچھلے Content Modifier میں سیٹ کریں، یا value کو اوپر والے header ٹیبل میں منتقل کریں۔

  • 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 والا مضمون دیکھیں)۔
  • Source types ‏Constant، Local Variable، Global Variable اور Number Range مقررہ اور محفوظ شدہ values کے لیے ہیں۔

Headers یا exchange properties: کون سا استعمال کریں

header، message کے ساتھ سفر کرتا ہے۔ Receiver adapters، headers کو اس سسٹم تک پہنچا سکتے ہیں جسے آپ 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 کی محفوظ کاپیاں۔
  • جو values کسی adapter یا اگلے iFlow تک پہنچنی ہوں ان کے لیے header استعمال کریں، اور جو headers tenant سے باہر نہیں جانے چاہئیں انہیں ہٹا دیں۔
  • بڑی values کو headers میں نہ رکھیں: وہ ہر call کے ساتھ سفر کرتی ہیں۔

Router اور Filter میں Simple شرائط

Router کے کسی route یا Non-XML قسم کے Filter میں شرط ایک Simple expression ہوتی ہے جس کا کسی value سے موازنہ کیا جاتا ہے۔ عام operators یہ ہیں: =، !=، >، >=، <، <=، contains، in اور regex، جنہیں and یا or سے جوڑا جاتا ہے۔ متن والی values سنگل quotes میں لکھی جاتی ہیں:

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

اگر شرط میں موجود header یا property موجود نہ ہو تو شرط بس false ہو جاتی ہے اور message کوئی دوسرا route لیتا ہے، اکثر default والا۔ نامعلوم headers اور properties والا مضمون بتاتا ہے کہ production تک پہنچنے سے پہلے اسے کیسے پکڑا جائے۔

Kitegra کیسے مدد کرتا ہے

Kitegra، SAP Integration Suite ڈیزائنر کے لیے ایک براؤزر ایکسٹینشن ہے۔ ڈیزائنر کے کسی 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 سے آپ کو paths کی تجاویز بھی ملتی ہیں، جیسا کہ XPath والا مضمون بتاتا ہے۔ ایکسٹینشن کبھی کسی iFlow کا مواد محفوظ، ڈپلائے یا ایڈٹ نہیں کرتی، اور آپ کا tenant صرف تب بدلتا ہے جب آپ چار نامزد اقدامات میں سے کسی ایک پر کلک کریں، جنہیں بند کیا جا سکتا ہے۔

آپ کے expressions اصل میں کیا values بناتے ہیں، یہ دیکھنے کے لیے message کو مرحلہ وار 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 کے نام case-sensitive ہیں، اس لیے ${property.OrderID} اور ${property.orderId} الگ properties ہیں۔

جب میں اسی Content Modifier میں کسی property سے header سیٹ کرتا ہوں تو وہ خالی کیوں ہوتا ہے؟

Content Modifier پہلے header ٹیبل، پھر property ٹیبل اور پھر body کو evaluate کرتا ہے۔ header اسی step میں بنائی گئی property نہیں پڑھ سکتا؛ property کسی پچھلے step میں سیٹ کریں۔

فائل کے نام یا کسی field میں آج کی تاریخ کیسے ڈالوں؟

${date:now:yyyy-MM-dd} کسی بھی Java date pattern کے ساتھ استعمال کریں، مثلاً timestamp کے لیے ${date:now:yyyyMMddHHmmss}۔

کیا {{parameter}} ایک Simple expression ہے؟

نہیں۔ {{…}} ایک externalized parameter کو ظاہر کرتا ہے، جو iFlow ڈپلائے ہونے پر ایک بار بدلا جاتا ہے۔ ${…} کو Camel ہر message کے لیے evaluate کرتا ہے۔

اگر کوئی expression ایسے header کا نام لے جو موجود نہیں تو کیا ہوتا ہے؟

یہ بغیر کسی error کے خالی value واپس کرتا ہے، اس لیے مسئلہ بعد میں غلط route یا خالی field کی صورت میں سامنے آتا ہے۔ Lint check یا guard step اسے پہلے پکڑ لیتا ہے۔

ڈیزائنر چھوڑے بغیر iFlows پر کام کریں

Kitegra کو Chrome یا Microsoft Edge میں شامل کریں۔ مفت شروع کریں، کسی اکاؤنٹ کی ضرورت نہیں۔