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

এই নিবন্ধের মডিউল: Integration Flow Helper

SAP CPI-তে অজানা headers ও properties: নিঃশব্দে fail করার আগেই ধরুন

SAP CPI-তে ভুল বানানের বা অনুপস্থিত header বা exchange property কেন error ছাড়াই fail করে, সাধারণ কারণগুলো, এবং design time ও runtime-এ কীভাবে ধরবেন।

SAP CPI-তে অজানা headers ও properties: নিঃশব্দে fail করার আগেই ধরুন

যে header কখনো সেট হয়নি, তা SAP CPI-এর iFlow থামায় না। যে expression সেটি পড়ে তা একটি খালি value ফেরত দেয়, Router condition false হয়ে যায়, payload-এর একটি field ফাঁকা থাকে, আর message এগিয়ে চলে। Error যদি আসেও, তা আসে কয়েক step পরে বা receiving system-এ।

এই নিবন্ধে ব্যাখ্যা করা হয়েছে অনুপস্থিত headers ও exchange properties কেন নিঃশব্দে fail করে, কোন কারণগুলো বারবার ফিরে আসে, এবং কোন যাচাইগুলো কোনো message-এর আগেই সেগুলো ধরে ফেলে।

অনুপস্থিত নাম কেন error দেয় না

Apache Camel কোনো header বা property না থাকাকে error নয়, খালি value হিসেবে ধরে। ঐচ্ছিক values-এর জন্য এটি সুবিধাজনক, আর এ কারণেই একটি typo মাসের পর মাস iFlow-এ থেকে যেতে পারে। আপনি কী দেখবেন তা নির্ভর করে নামটি কোথায় পড়া হচ্ছে তার ওপর:

  • ${property.orderId}-এর মতো Content Modifier value একটি খালি string হয়ে যায়।
  • ${header.orderType} = 'EXPRESS'-এর মতো Router বা Filter condition false হয়, তাই message অন্য route নেয়, প্রায়ই default route।
  • /orders/${property.orderId}-এর মতো receiver address /orders/-কে call করে, আর receiving system এমন error দিয়ে উত্তর দেয় যাতে অনুপস্থিত property-এর কোনো উল্লেখ নেই।
  • Groovy script-এ message.getHeader("orderId", String) null ফেরত দেয়, আর script পরে null pointer error-এ fail করে বা payload-এ null শব্দটি লিখে দেয়।

সাধারণ কারণগুলো

  • Property-এর নামে typo বা ভুল case: exchange property-এর নাম case-sensitive, তাই orderID ও orderId দুটি আলাদা property। Header-এর নাম case-sensitive নয়।
  • একটি অতিরিক্ত space, যেমন ${header.orderId }: space-সহ নামটি একটি আলাদা নাম।
  • Router-এর শুধু একটি route-এ সেট করা value, যা routes আবার মিলে যাওয়ার পরে পড়া হয়।
  • Caller (যে call করে)-এর পাঠানো header যাকে ঢুকতে দেওয়া হয়নি: HTTPS sender শুধু সেই custom headers ঢুকতে দেয় যেগুলো iFlow-এর Runtime Configuration-এ Allowed Header(s)-এ তালিকাভুক্ত।
  • অন্য iFlow থেকে প্রত্যাশিত property: exchange properties ProcessDirect call পার হয় না, শুধু headers হয় (ProcessDirect ও JMS নিবন্ধটি দেখুন)।
  • এমন header row যা একই Content Modifier-এ তৈরি property পড়ে, অথচ Content Modifier header table চালায় property table-এর আগে।

অনুপস্থিত value-কে স্পষ্টভাবে fail করান

যে values ছাড়া flow চলতে পারে না, সেগুলোর জন্য যেখানে দরকার সেখানেই fail করান, তিন step পরে নয়। Flow-এর শুরুতে একটি ছোট Groovy step যথেষ্ট:

import com.sap.gateway.ip.core.customdev.util.Message

def Message processData(Message message) {
    def orderId = message.getProperty("orderId")
    if (orderId == null || orderId.toString().trim().isEmpty()) {
        throw new IllegalStateException("Exchange property orderId is not set")
    }
    return message
}

তখন message এমন একটি error-এ শেষ হয় যাতে অনুপস্থিত property-এর নাম থাকে, এবং তা message processing log-এ দেখা যায়। Router conditions-এর ক্ষেত্রে default route-কে একটি স্পষ্ট উদ্দেশ্য দিন: যখন প্রতিটি message-এর কোনো না কোনো route-এ মেলা বাধ্যতামূলক, তখন default route-টি একটি Error End event-এ শেষ করুন, message-কে fallback-এর জন্য তৈরি পথে চলে যেতে না দিয়ে।

Test করার সময় iFlow-এর log level Trace-এ রাখুন। Trace প্রতিটি step-এ headers ও exchange properties দেখায়, তাই কোথায় একটি value হারিয়ে যায় তা আপনি ঠিক দেখতে পাবেন।

Deploy করার আগের checklist

  1. iFlow যত header ও property পড়ে সবগুলোর তালিকা করুন: expressions, conditions, adapter fields ও scripts-এ।
  2. প্রতিটির জন্য সেই step খুঁজুন যা সেটি সেট করে, পড়ার জায়গায় পৌঁছানো প্রতিটি route-এ।
  3. হুবহু বানান মিলিয়ে দেখুন, properties-এর case ও যেকোনো space সহ।
  4. Sender থেকে আসা headers-এর জন্য দেখুন সেগুলো Allowed Header(s)-এ আছে কিনা।
  5. অন্য iFlow থেকে আসা values-এর জন্য দেখুন সেগুলো properties হিসেবে নয়, headers হিসেবে আসছে কিনা।

বড় iFlow-এ হাতে করলে এই যাচাইয়ে বেশ সময় লাগে, তাই এটিই প্রথম যাচাই যা automate করা লাভজনক।

নামকরণের অভ্যাস যা সমস্যাটি এড়ায়

  • একটি style বেছে নিন, যেমন camelCase, এবং package-এর প্রতিটি header ও property-তে সেটিই ব্যবহার করুন।
  • পুরো flow যে values-এর ওপর নির্ভর করে, সেগুলো শুরুর কাছাকাছি একটি Content Modifier-এ সেট করুন, যাতে খোঁজার একটিই জায়গা থাকে।
  • SAP_ ও Camel prefixes SAP ও Apache Camel-এর জন্য রেখে দিন; নিজের নামগুলোকে অন্য রূপ দিন।
  • যে values শুধু এই iFlow-এর দরকার সেগুলোর জন্য properties, আর headers শুধু সেই values-এর জন্য যা বাইরে যেতে হবে।

Camel Simple expressions নিয়ে নিবন্ধটি এই তালিকার প্রতিটি নামের পেছনের syntax ব্যাখ্যা করে।

Kitegra কীভাবে সাহায্য করে

Kitegra browser এক্সটেনশন এই checklist SAP Integration Suite ডিজাইনারের ভেতরেই চালায়। এর lint panel deploy করার আগেই এমন headers ও properties যা iFlow-এর কিছুই সেট করে না, বন্ধ না করা ${ এবং expressions-এ অতিরিক্ত spaces চিহ্নিত করে।

আপনি ${ বা $ লিখলে এটি শুধু সেই নামগুলো সাজেস্ট করে যা iFlow সেট করে, Groovy ও JavaScript scripts-এ সেট করা নামসহ, সঙ্গে SAP ও Camel-এর standard headers, তাই শুরু থেকেই typo-র সম্ভাবনা কম থাকে। যে নাম শুধু কিছু path-এ সেট হয়, তাতে "শুধু কিছু পাথে সেট হয়" চিহ্ন থাকে। এক্সটেনশনটি কখনো কোনো iFlow-এর content সংরক্ষণ, deploy বা edit করে না, এবং আপনার tenant কেবল তখনই বদলায় যখন আপনি নাম দেওয়া চারটি action-এর একটিতে ক্লিক করেন, যেগুলো বন্ধও করা যায়।

Runtime-এ কোনো value খালি থাকলে message-টি step by step trace করলে প্রতিটি step-এর আগের headers ও properties দেখা যায়, আর iFlow review checklist এর পেছনের design ভুলগুলো তুলে ধরে।

Kitegra অ্যাকাউন্ট ছাড়া এটি প্রতিটি মডিউলে 5টি iFlow-এ কাজ করে। Free প্ল্যানে 50, Starter-এ 100 এবং Pro-তে 300টি iFlow অন্তর্ভুক্ত; Business-এ কোনো সীমা নেই। প্ল্যানগুলো তুলনা করুন।

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

SAP Integration Suite ডিজাইনারে Kitegra কী করে তা পড়ুন, অথবা Kitegra-এর অন্য Chrome এক্সটেনশনগুলোর পাশে এটি দেখুন।

সাধারণ জিজ্ঞাসা

Header না থাকলে SAP CPI কেন error দেয় না?

Apache Camel অনুপস্থিত header বা property-এর জন্য একটি খালি value ফেরত দেয়। সমস্যাটি দেখা দেয় কেবল সেখানে যেখানে সেই খালি value ক্ষতি করে, প্রায়ই কয়েক step পরে।

আমার exchange property null কেন, যখন দেখছি সেটি সেট হচ্ছে?

Case যাচাই করুন: exchange property-এর নাম case-sensitive। আরও দেখুন যে step-টি এটি সেট করে তা message-এর নেওয়া route-এ চলে কিনা, এবং value-টি ProcessDirect call দিয়ে আসার কথা ছিল কিনা।

Caller-এর পাঠানো header আমার iFlow-এ পৌঁছায় না কেন?

HTTPS sender শুধু সেই custom headers ঢুকতে দেয় যেগুলো iFlow-এর Runtime Configuration-এ Allowed Header(s)-এ তালিকাভুক্ত। সেখানে header-এর নাম যোগ করুন।

প্রতিটি step-এ headers ও properties কীভাবে দেখব?

iFlow-এর log level Trace-এ সেট করে একটি message চালান। Monitor-এর trace প্রতিটি step-এর headers ও exchange properties দেখায়।

প্রয়োজনীয় value না থাকলে flow কীভাবে থামাব?

একটি script step যোগ করুন যা value যাচাই করে এবং স্পষ্ট message-সহ exception throw করে, অথবা Router-এর default branch একটি Error End event-এ পাঠান।

Deploy করার আগে কি এটি যাচাই করা যায়?

হ্যাঁ, iFlow যত নাম পড়ে সেগুলোকে যত নাম সেট করে তার সঙ্গে মিলিয়ে। Kitegra-এর lint panel ডিজাইনারেই এটি করে।

ডিজাইনার না ছেড়েই iFlows-এ কাজ করুন

Kitegra Chrome বা Microsoft Edge-এ যোগ করুন। ফ্রিতে শুরু করুন, কোনো অ্যাকাউন্ট লাগবে না।