মূল কনটেন্টে যান
← ব্লগে ফিরে যান

এই নিবন্ধের মডিউল: 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 adapter-এর address ও query fields-এ, Router ও Filter-এর Non-XML conditions-এ, এবং mail subject বা SFTP file name-এর মতো fields-এ। Externalized parameters দেখতে একই রকম হলেও আলাদা জিনিস: {{receiverHost}} deploy করার সময় মাত্র একবার বদলানো হয়, আর ${…} প্রতিটি message-এর জন্য evaluate হয়।

প্রতিদিনের expressions

অল্প কয়েকটি expression দিয়েই বেশিরভাগ iFlow-এর কাজ চলে যায়, আর এগুলো 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 স্থির ও সংরক্ষিত 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} দুটি আলাদা property, আর দ্বিতীয়টি হয়তো আদৌ নেই।

  • যে 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-এর নাম। যে নাম শুধু কিছু path-এ সেট হয়, তাতে "শুধু কিছু পাথে সেট হয়" চিহ্ন থাকে।

এর lint panel বন্ধ না করা ${, expression-এর ভেতরে অতিরিক্ত spaces, এবং এমন headers বা properties চিহ্নিত করে যা iFlow-এর কিছুই সেট করে না। XPath rows-এর জন্য একটি sample payload থেকেও path সাজেশন পাওয়া যায়, যেমন XPath নিবন্ধে ব্যাখ্যা করা হয়েছে। এক্সটেনশনটি কখনো কোনো iFlow-এর content সংরক্ষণ, deploy বা edit করে না, এবং আপনার tenant কেবল তখনই বদলায় যখন আপনি নাম দেওয়া চারটি action-এর একটিতে ক্লিক করেন, যেগুলো বন্ধও করা যায়।

আপনার expressions আসলে কোন values তৈরি করে তা দেখতে একটি message step by step trace করুন এবং প্রতিটি step-এর আগের headers ও properties পড়ুন।

Kitegra অ্যাকাউন্ট ছাড়া এটি প্রতিটি মডিউলে 5টি iFlow-এ কাজ করে। Free প্ল্যানে 50, Starter-এ 100 এবং Pro-তে 300টি iFlow অন্তর্ভুক্ত। টিম প্ল্যানে প্রতিটি সদস্য Pro পান, Startup Team-এ প্রতি মডিউলে 300টি iFlow সহ, আর Growth Team ও Scale Team-এ কোনো সীমা নেই। Kitegra লঞ্চের সময়টায়, সাইন ইন করা সবার জন্য প্রতিটি টুল খোলা, Free প্ল্যানেও। প্ল্যানগুলো তুলনা করুন।

আপনার পরবর্তী iFlow-এ চেষ্টা করুন

SAP Integration Suite ডিজাইনারে Kitegra কী করে তা পড়ুন, অথবা 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} আলাদা property।

একই Content Modifier-এ property থেকে সেট করলে আমার header খালি থাকে কেন?

Content Modifier প্রথমে header table, তারপর property table, তারপর body evaluate করে। একটি header একই step-এ তৈরি হওয়া property পড়তে পারে না; property-টি আগের কোনো step-এ সেট করুন।

File name বা field-এ আজকের তারিখ কীভাবে বসাব?

যেকোনো Java date pattern সহ ${date:now:yyyy-MM-dd} ব্যবহার করুন, যেমন 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-এ যোগ করুন। ফ্রিতে শুরু করুন, কোনো অ্যাকাউন্ট লাগবে না।