কিভাবে একটি জাভা কলআউট তৈরি করতে হয়

আপনি Apigee Edge-এর ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন
.info- তে যান।

জাভা কলআউট কী?

Apigee Edge বিভিন্ন ধরনের পলিসি প্রদান করে যা নিরাপত্তা, ডেটা রূপান্তর, ট্র্যাফিক ব্যবস্থাপনা এবং অন্যান্য সাধারণ এপিআই ব্যবস্থাপনার প্রয়োজনীয়তাগুলো পূরণ করে।

তবে, কিছু ক্ষেত্রে আপনার API-এর জন্য এমন কাস্টম আচরণের প্রয়োজন হয় যা কোনো স্ট্যান্ডার্ড পলিসিতে অন্তর্ভুক্ত নয়। এইসব ক্ষেত্রে, Apigee বেশ কিছু বিকল্প প্রদান করে যা আপনাকে কাস্টমাইজড API আচরণ স্ক্রিপ্ট বা কোড করার সুযোগ দেয়। এর একটি উপায় হলো জাভাতে কাঙ্ক্ষিত আচরণটি ইমপ্লিমেন্ট করা।

জাভার সমর্থিত সংস্করণগুলোর জন্য, সমর্থিত সফ্টওয়্যার এবং সমর্থিত সংস্করণসমূহ দেখুন।

আমি প্রক্সিতে জাভা কোড কীভাবে ব্যবহার করব?

একটি জাভা কলআউট পলিসি আপনাকে একটি চলমান প্রক্সি ফ্লো-এর ভেতর থেকে জাভা কোড কল করার সুযোগ দেয়। আপনার জাভা কোডকে অবশ্যই কিছু এজ-নির্দিষ্ট জাভা ইন্টারফেস ইমপ্লিমেন্ট করতে হবে, যা কোডটিকে চলমান প্রক্সির সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেয়। উদাহরণস্বরূপ, প্রক্সির বর্তমান ফ্লো কনটেক্সটের মধ্যে হেডার, কোয়েরি প্যারামিটার, ফ্লো ভেরিয়েবল এবং অন্যান্য এনটিটি গেট ও সেট করার জন্য জাভা মেথড রয়েছে।

কখন জাভা কলআউট ব্যবহার করা উচিত?

চলুন এমন পরিস্থিতিগুলো দেখি যেখানে জাভা কলআউটগুলো উপযোগী, এবং এমন পরিস্থিতিগুলোও দেখি যেখানে আপনার অন্যান্য পন্থা বিবেচনা করা উচিত।

প্রথমে, বিকল্প পন্থাগুলো বিবেচনা করুন।

জাভা কলআউট ব্যবহার করার আগে মনে রাখবেন যে, এর পরিবর্তে ব্যবহার করার মতো বিকল্প পদ্ধতিও থাকতে পারে। উদাহরণস্বরূপ:

  • রিমোট সার্ভিসে HTTP API কলের মতো হালকা অপারেশনের জন্য, ServiceCallout পলিসি ব্যবহার করার কথা বিবেচনা করুন। সার্ভিস কলআউট পলিসি দেখুন।
  • মেসেজের বিষয়বস্তুর সাথে তুলনামূলকভাবে সহজ কাজ, যেমন HTTP হেডার, প্যারামিটার বা মেসেজের বিষয়বস্তু পরিবর্তন বা নিষ্কাশন করার জন্য, আপনি জাভাস্ক্রিপ্ট বা পাইথন ভাষা ব্যবহার করতে পারেন।

জাভা কোডে আপনি যা করতে পারেন

একটি জাভা কলআউট এই মৌলিক অপারেশনগুলো সমর্থন করে:

  • অনুরোধ বা প্রতিক্রিয়া বার্তা পরীক্ষা করা বা পরিবর্তন করা
  • ফ্লো ভেরিয়েবল গ্রহণ এবং সেট করা। আপনি জাভা মেথড ব্যবহার করে এজ ফ্লো ভেরিয়েবল অ্যাক্সেস করতে পারেন। যদি আপনি কী ভ্যালু ম্যাপ (KVM) তথ্য অ্যাক্সেস করতে চান, তাহলে একটি KVM পলিসি ব্যবহার করুন, ফ্লো ভেরিয়েবলগুলিতে KVM ভ্যালু অ্যাসাইন করুন, এবং তারপরে আপনি জাভা কলআউটের ভেতর থেকে ফ্লো ভেরিয়েবলগুলি অ্যাক্সেস করতে পারবেন।
  • বাহ্যিক পরিষেবাগুলিতে কল করা
  • ত্রুটি উত্থাপন করা
  • ত্রুটির বার্তা এবং স্ট্যাটাস কোড পরিবর্তন করা

জাভা কোডে যা করা যায় না

বেশিরভাগ সিস্টেম কল অনুমোদিত নয়। আপনি পারবেন না :

  • অভ্যন্তরীণ ফাইল সিস্টেমে রিড বা রাইট করুন। এর মানে হলো, আপনি অভ্যন্তরীণ ফাইল সিস্টেমে রিড/রাইট করার জন্য কোনো জাভা প্যাকেজ ব্যবহার করতে পারবেন না; তবে, আপনি বাহ্যিক রিমোট কল করতে পারবেন।
  • মেশিনের বর্তমান প্রসেস, প্রসেস তালিকা, বা সিপিইউ/মেমরি ব্যবহারের তথ্য জানুন।
  • `expressions-1.0.0.jar` এবং `message-flow-1.0.0.jar`-এ থাকা সোর্স কোডটি অ্যাক্সেস করুন।

যদিও এই ধরনের কিছু কল কাজ করতে পারে, সেগুলি অসমর্থিত এবং যেকোনো সময় সক্রিয়ভাবে নিষ্ক্রিয় করে দেওয়া হতে পারে। আপনার কোডে এই ধরনের কল করা থেকে বিরত থাকুন।

Apigee Edge-এর সাথে অন্তর্ভুক্ত জাভা লাইব্রেরিগুলো ব্যবহার বা সেগুলোর উপর নির্ভর করবেন না। এই লাইব্রেরিগুলো শুধুমাত্র Edge প্রোডাক্টের কার্যকারিতার জন্য, এবং প্রতিটি রিলিজে একটি লাইব্রেরি উপলব্ধ থাকবে এমন কোনো নিশ্চয়তা নেই। যদি আপনি এই ধরনের লাইব্রেরি ব্যবহার করেন, তবে সেগুলো শুধুমাত্র নন-প্রোডাকশন ডেমোনস্ট্রেশনে ব্যবহার করুন।

হ্যালো জাভা কলআউট

চলুন একটি সাধারণ 'হ্যালো ওয়ার্ল্ড' জাভা কলআউটের উদাহরণ দেখে নেওয়া যাক। এই উদাহরণে, আমরা একটি জাভা কলআউটসহ একটি সাধারণ প্রক্সি তৈরি করব যা একটি "হ্যালো ওয়ার্ল্ড" প্রতিক্রিয়া ফেরত দেয়। প্রক্সিটি দুটি সম্ভাব্য প্রতিক্রিয়ার মধ্যে যেকোনো একটি ফেরত দিতে পারে:

  • আপনি যদি 'username' হেডারে 'name' ভ্যালুটি পাস করেন, তাহলে প্রক্সিটি রিটার্ন করবে:

    Hello, <name>!
  • হেডারটি বাদ দিলে, প্রক্সিটি শুধু এই ফলাফলটি ফেরত দেয়:

    "Hello, Guest!"

স্টার্টার প্রজেক্টটি ডাউনলোড করুন

বিষয়টি সহজ করার জন্য, আমরা গিটহাবের Apigee api-platform-samples রিপোজিটরিতে আপনার জন্য একটি বেসিক প্রজেক্ট প্রস্তুত করে রেখেছি।

  1. আপনার সিস্টেমে api-platform-samples ডাউনলোড বা ক্লোন করুন।
  2. আপনার পছন্দের কোনো টার্মিনাল বা কোড এডিটরে, api-platform-samples/doc-samples/java-hello প্রজেক্টটিতে যান।

জাভা কোড লিখুন

  1. জাভা সোর্স ফাইলটি খুলুন: java-hello/callout/src/main/java/HelloJava.java । এই ফাইলটি হলো মূল জাভা ক্লাসের একটি কাঠামো সংস্করণ, যা আমরা ইমপ্লিমেন্ট করব। Edge Java Callout কোডের জন্য ইম্পোর্ট করা প্যাকেজগুলো আবশ্যক। এই ক্লাসগুলো এমন মেথড সরবরাহ করে, যা আপনাকে প্রক্সি এক্সিকিউশন কনটেক্সট অ্যাক্সেস করার সুযোগ দেয়। আমরা শীঘ্রই এই কোডটি কম্পাইল এবং ডিপ্লয় করার ধাপগুলো আলোচনা করব।
    package com.apigeesample;
    
    import com.apigee.flow.execution.ExecutionContext;
    import com.apigee.flow.execution.ExecutionResult;
    import com.apigee.flow.execution.spi.Execution;
    import com.apigee.flow.message.MessageContext;
    
    
    public class HelloJava implements Execution {
    
            public ExecutionResult execute(MessageContext messageContext, ExecutionContext executionContext) {
                    
                    try {
    
                            // Your code here.
                
                return ExecutionResult.SUCCESS;
    
                    } catch (Exception e) {
                            return ExecutionResult.ABORT;
                    }
            }
    
    }
  2. কমেন্ট করা লাইন // Your code here এর পরিবর্তে নিচের কোডটি ব্যবহার করুন:

    String name = messageContext.getMessage().getHeader("username");
    
    if (name != null && name.length()>0) {
            messageContext.getMessage().setContent("Hello, " + name + "!");
            messageContext.getMessage().removeHeader("username");
    } else {
            messageContext.getMessage().setContent("Hello, Guest!");
    }
  3. ফাইলটি সংরক্ষণ করুন।


Maven দিয়ে আপনার কোড কম্পাইল করুন

প্রজেক্টটি এমনভাবে তৈরি করা হয়েছে যাতে আপনি Maven দিয়ে কম্পাইল করতে পারেন। আপনি যদি javac ব্যবহার করতে চান, তাহলে আমরা Maven উদাহরণটি অনুসরণ করে একটি উদাহরণ অন্তর্ভুক্ত করব।

  1. নিশ্চিত করুন যে আপনার Maven ইনস্টল করা আছে:

    mvn -version
  2. java-hello/buildsetup.sh স্ক্রিপ্টটি চালান। এই স্ক্রিপ্টটি আপনার স্থানীয় Maven রিপোজিটরিতে প্রয়োজনীয় JAR নির্ভরতাগুলি ইনস্টল করে।
  3. java-hello/callout ডিরেক্টরিতে যান।
  4. Maven চালান:

    mvn clean package
  5. আপনি চাইলে, edge-custom-policy-java-hello.jar ফাইলটি java-hello/apiproxy/resources/java তে কপি করা হয়েছে কিনা তা যাচাই করে নিতে পারেন। যে JAR ফাইলগুলো আপনি প্রক্সির মাধ্যমে ডেপ্লয় করতে চান, সেগুলোর জন্য এই লোকেশনটিই প্রয়োজন।

javac দিয়ে কম্পাইল করুন (ঐচ্ছিক)

পূর্ববর্তী অংশে, আপনি একটি Maven কমান্ডের সাহায্যে প্রয়োজনীয় Java JAR ফাইলটি স্বয়ংক্রিয়ভাবে তৈরি করেছেন। বিকল্পভাবে, যদি আপনি কোডটি কম্পাইল করার জন্য javac ব্যবহার করতে চান, তাহলে আপনি নিম্নলিখিতের মতো কিছু করতে পারেন ( java-hello ডিরেক্টরি থেকে)। প্রয়োজনীয় JAR ফাইলগুলো আপনার জন্য java-hello/lib ডিরেক্টরিতে সরবরাহ করা হয়েছে।

  1. api-platform-samples/doc-samples/java-hello তে cd করুন।
  2. আপনার পাথে javac আছে কিনা তা নিশ্চিত করুন।

    javac -version
  3. নিম্নলিখিত javac কমান্ডটি চালান:

    javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/HelloJava.java
    এটি com/apigeesample/HelloJava.class তৈরি করে।
  4. apiproxy/resources/java ডিরেক্টরিতে কম্পাইল করা ক্লাস সম্বলিত একটি JAR ফাইল তৈরি করুন। যে JAR ফাইলগুলো আপনি প্রক্সির মাধ্যমে ডেপ্লয় করতে চান, সেগুলোর জন্য এই স্থানটি আবশ্যক। java-hello ডিরেক্টরিতে নিম্নলিখিত কমান্ডটি চালিয়ে আপনি এটি করতে পারেন (শেষে পূর্ণচ্ছেদটি দিতে ভুলবেন না)।

    jar cvf apiproxy/resources/java/edge-custom-policy-java-hello.jar -C com .
    

প্রক্সি স্থাপন করুন এবং কল করুন

./java-hello ডিরেক্টরিতে একটি ডিপ্লয় স্ক্রিপ্ট দেওয়া আছে। কিন্তু এটি চালানোর আগে, আপনাকে একটি সংক্ষিপ্ত সেটআপ করে নিতে হবে।

  1. api-platform-samples/doc-samples/java-hello cd করুন
  2. যদি আপনি ইতিমধ্যে তা না করে থাকেন, তাহলে ../../setup/setenv.sh ফাইলটি খুলুন এবং আপনার Apigee অ্যাকাউন্টের তথ্য দিয়ে নির্দেশিতভাবে এটি সম্পাদনা করুন: আপনার ইউজারনেম (আপনার অ্যাকাউন্টের সাথে যুক্ত ইমেল ঠিকানা), আপনার প্রতিষ্ঠানের নাম, এবং API ম্যানেজমেন্ট কল করার জন্য আপনি যে ডোমেইনটি ব্যবহার করেন। উদাহরণস্বরূপ, Edge ক্লাউডের জন্য ডোমেইনটি হলো https://api.enterprise.apigee.com ; তবে, আপনি যদি Edge প্রাইভেট ক্লাউড ব্যবহার করেন, তাহলে আপনার ডোমেইনটি ভিন্ন হতে পারে।
  3. setenv.sh ফাইলটি সংরক্ষণ করুন।
  4. ডিপ্লয় স্ক্রিপ্টটি চালান:

    ./deploy.sh
  5. ডিপ্লয় সফল হলে, ইনভোক স্ক্রিপ্টটি চালান:

    ./invoke.sh

    ইনভোক স্ক্রিপ্টটি একটি cURL কমান্ড কল করে যা দেখতে এইরকম:

    curl  http://$org-$env.$api_domain/java-hello -H "username:Will"

    যার উত্তরে আসে "হ্যালো, উইল!"

    আপনি নামটি পরিবর্তন করার জন্য invoke.sh স্ক্রিপ্টটি সম্পাদনা করতে পারেন, অথবা যদি আপনি হেডারটি সরিয়ে ফেলার জন্য cURL কলটি পরিবর্তন করেন, তাহলে কমান্ডটি "Hello, Guest!" রিটার্ন করবে।

প্রক্সি সম্পর্কে

চলুন এই প্রক্সিতে ব্যবহৃত পলিসিগুলো দ্রুত দেখে নেওয়া যাক। প্রক্সি ফ্লোতে পলিসিগুলো কোথায় এবং কেন রাখা হয়েছে, সেদিকে মনোযোগ দিন।

বার্তা নীতি নির্ধারণ

ProxyEndpoint রিকোয়েস্ট ফ্লো- এর সাথে একটি অ্যাসাইন মেসেজ পলিসি সংযুক্ত থাকে। এটি রিকোয়েস্ট থেকে ইউজারনেম হেডারটি কপি করে রেসপন্সে অ্যাসাইন করে। এই অপারেশনটি রেসপন্স ফ্লো-এর সাথে সংযুক্ত জাভা কলআউট পলিসিকে ইউজারনেম হেডারটি অ্যাক্সেস করতে এবং সেই হেডারের ভ্যালু ব্যবহার করে একটি কাস্টম রেসপন্স বডি তৈরি করতে সক্ষম করে।

<AssignMessage async="false" continueOnError="false" enabled="true" name="CopyHeader">     
    <DisplayName>CopyHeader</DisplayName>     
    <Copy source="request">         
        <Headers>             
          <Header name="username"/>         
        </Headers>     
    </Copy>     
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>     
    <AssignTo createNew="false" transport="http" type="response"/> 
</AssignMessage>

জাভা কলআউট নীতি

জাভা কলআউট পলিসিটি রেসপন্স ফ্লো- এর সাথে সংযুক্ত থাকে। এর কারণ হলো, কাস্টম জাভা কোডটি রেসপন্স হেডার এবং মেসেজে পরিবর্তন করে থাকে। পলিসিটির ClassName এলিমেন্টটি সেই প্রধান ক্লাসকে নির্দিষ্ট করে, যা পলিসিটি দ্বারা এক্সিকিউট করা হয়। ResourceURL এলিমেন্টটি হলো সেই JAR ফাইলের নাম, যা আপনি বিল্ড করে প্রক্সির resources/java ডিরেক্টরিতে যুক্ত করেছেন।

<JavaCallout name="hello-java">         
    <ClassName>com.apigeesample.HelloJava</ClassName>         
    <ResourceURL>java://edge-custom-policy-java-hello.jar</ResourceURL> 
</JavaCallout>

জাভা কলআউট সম্পর্কে আপনার যা জানা প্রয়োজন

জাভা কলআউট বাস্তবায়নের ক্ষেত্রে লক্ষণীয় গুরুত্বপূর্ণ বিষয়গুলো হলো:

  • com.apigee.flow.execution এবং com.apigee.flow.message প্যাকেজগুলো থেকে ক্লাস ইম্পোর্ট করে। প্যাকেজ ও ডেপ্লয় করা JAR ফাইলে এই প্যাকেজগুলো অবশ্যই অন্তর্ভুক্ত থাকতে হবে। আপনি ম্যানেজমেন্ট UI প্রক্সি এডিটরের মাধ্যমে আপনার জাভা JAR আপলোড করতে পারেন, অথবা আপনার স্থানীয়ভাবে তৈরি করা API প্রক্সিগুলোর /resources/java ডিরেক্টরিতে এটি অন্তর্ভুক্ত করতে পারেন।
  • Execution ইন্টারফেসটি ইমপ্লিমেন্ট করে। এপিআই প্রক্সির মধ্যে এক্সিকিউট হওয়া যেকোনো জাভা কোডকে অবশ্যই Execution ইমপ্লিমেন্ট করতে হবে।
  • একটি জাভা কলআউট পলিসিতে কোনো প্রকৃত কোড থাকে না। এর পরিবর্তে, একটি জাভা কলআউট পলিসি একটি জাভা 'রিসোর্স'-কে রেফারেন্স করে, যেটিকে আপনাকে অবশ্যই একটি JAR ফাইলে প্যাকেজ করতে হবে।
  • যেসব প্যাকেজের নাম পরিহার করতে হবে: জাভা কলআউটে প্যাকেজের নাম হিসেবে io.apigee বা com.apigee ব্যবহার করবেন না। এগুলো সংরক্ষিত এবং অন্যান্য Apigee মডিউল দ্বারা ব্যবহৃত হয়।
  • আপনার জাভা কলআউট যদি স্বতন্ত্র JAR ফাইল হিসেবে প্যাকেজ করা অতিরিক্ত থার্ড-পার্টি লাইব্রেরির উপর নির্ভর করে, তাহলে সেই JAR ফাইলগুলোও /resources/java ডিরেক্টরিতে রাখুন, যাতে রানটাইমে সেগুলো সঠিকভাবে লোড হয়।
  • একাধিক JAR ফাইল থাকলে, সেগুলোকে অতিরিক্ত রিসোর্স হিসেবে যুক্ত করুন। অতিরিক্ত JAR ফাইলগুলোকে উল্লেখ করার জন্য পলিসি কনফিগারেশন পরিবর্তন করার কোনো প্রয়োজন নেই। সেগুলোকে /resources/java ফোল্ডারে রাখাই যথেষ্ট।
  • জাভা JAR আপলোড করার বিষয়ে অতিরিক্ত তথ্যের জন্য, রিসোর্স ফাইলস দেখুন।