অ্যান্টিগ্র্যাভিটি দিয়ে জাভা মনোলিথের আধুনিকীকরণ

১. ভূমিকা

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

অ্যান্টিগ্র্যাভিটির কেন্দ্রবিন্দুতে রয়েছে এজেন্ট ম্যানেজার , যা একটি "মিশন কন্ট্রোল" ড্যাশবোর্ড। এর মাধ্যমে এজেন্টগুলোকে জটিল কাজ সম্পাদনের সময় স্পন করা, মনিটর করা এবং তাদের সাথে ইন্টারঅ্যাক্ট করা যায়। এই কোডল্যাবটি এজেন্ট ম্যানেজারকে কাজে লাগিয়ে এমন এজেন্টগুলোকে অর্কেস্ট্রেট করার উপর আলোকপাত করে, যা স্প্রিং পেটক্লিনিক মনোলিথকে স্প্রিং বুট ২.৭ (জাভা ৮/১১) থেকে স্প্রিং বুট ৪.০.১ এবং জাভা ২৫- এ আধুনিকীকরণ করবে। এর ফলে আপনি পুরোনো লজিক বোঝার পেছনে কম সময় ব্যয় করে নতুন ফিচার তৈরিতে বেশি মনোযোগ দিতে পারবেন।

আপনি যা শিখবেন

  • এজেন্ট ম্যানেজারের সাহায্যে লিগ্যাসি কোড ব্যাখ্যা করুন।
  • Maven বিল্ড ফাইলগুলো Spring Boot 4.0.1-এ আপগ্রেড করুন।
  • javax.* থেকে jakarta.* নেমস্পেস মাইগ্রেশন স্বয়ংক্রিয় করুন।
  • Spring Data JPA প্যাটার্ন অনুযায়ী রিপোজিটরিগুলো রিফ্যাক্টর করুন।
  • ভার্চুয়াল থ্রেড এবং অ্যাকচুয়েটরের মতো আধুনিক ফিচারগুলো সক্রিয় করুন।
  • এআই-এর সাহায্যে টেস্টগুলো সংশোধন ও তৈরি করুন।

ব্যক্তি বস্তুর সংজ্ঞা

২. পরিবেশ প্রস্তুত করুন

  1. অ্যান্টিগ্র্যাভিটি অ্যাক্সেস করুন : আপনি এই কোডল্যাবটি অ্যান্টিগ্র্যাভিটি ব্যবহার করে সম্পন্ন করবেন, যা একটি এজেন্ট-ফার্স্ট অ্যাপ্লিকেশন। আপনি প্রাথমিকভাবে এজেন্ট ম্যানেজারের সাথে ইন্টারঅ্যাক্ট করবেন, যা এআই এজেন্টদের জন্য এর সমন্বিত মিশন কন্ট্রোল।
    • অ্যান্টিগ্র্যাভিটি : antigravity.google থেকে এজেন্ট-ফার্স্ট অ্যাপ্লিকেশনটি ডাউনলোড করুন।
  2. এজেন্ট ম্যানেজার খুলুন : অ্যান্টিগ্র্যাভিটি চালু করুন এবং এজেন্ট ম্যানেজার খুলুন, যা অ্যান্টিগ্র্যাভিটির এআই এজেন্টদের সাথে যোগাযোগ করার জন্য ব্যবহৃত ইন্টারফেস।
    এজেন্ট ম্যানেজার
  3. স্যাম্পলটি ক্লোন করুন : এই কমান্ডগুলো স্যাম্পল অ্যাপ্লিকেশনটি ক্লোন করে, নতুন ডিরেক্টরিতে প্রবেশ করে এবং সেই নির্দিষ্ট কমিটটি চেক আউট করে যা অ্যাপ্লিকেশনটিকে Spring Boot 2.7.0-এ পিন করে, যা আমাদের আধুনিকীকরণের সূচনা বিন্দু:
    git clone https://github.com/spring-projects/spring-petclinic.git
    cd spring-petclinic
    git checkout 1db99dbb58f670ef8e39e9f1edf134b21ce919d6
    

৩. লিগ্যাসি কোড বিশ্লেষণ করুন

লিগ্যাসি লজিক বোঝা একটি নিরাপদ মাইগ্রেশনের প্রথম ধাপ। এজেন্ট ম্যানেজার আপনাকে কোডবেস বুঝতে এবং আপনার আধুনিকীকরণ প্রচেষ্টার জন্য একটি রোডম্যাপ তৈরি করতে সাহায্য করতে পারে। সরাসরি আলাদা আলাদা ফাইলে প্রবেশ না করে, আপনি একটি আধুনিকীকরণ কৌশল পরিকল্পনা করতে সাহায্য করার জন্য এজেন্ট ম্যানেজারের কাছে কোডবেসের একটি সামগ্রিক চিত্র চাইতে পারেন।

উদাহরণস্বরূপ, আপনি এজেন্ট ম্যানেজারকে জিজ্ঞাসা করতে পারেন:

Give me a tour of this codebase to help plan a modernization strategy. Keep it high-level for now (no need to investigate the codebase line-by-line yet), and please organize your findings using these categories:

The Layout: Map out the main folders and what they do—specifically where the business rules are kept versus the setup and configuration files.

The Traffic Jams: Spot the files that seem to be the 'center of gravity.' These are the classes or modules that many other parts of the app depend on.

The Islands: Identify parts of the code that are relatively isolated. These are the components that have very few connections to the rest of the system and could be moved or updated first.

The Data Path: Trace the lifecycle of a typical request, showing how it moves from the entry point through the logic layer and down to the database.

Write the text summary to migration-map.md, and please include a Mermaid.js class diagram at the bottom that visualizes these relationships for those with a viewer installed.

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

অভিবাসন মানচিত্রের নমুনা ফলাফল

যখন আপনি অনুভব করবেন যে বর্তমান কোডবেসটি সম্পর্কে আপনার একটি দৃঢ় ধারণা তৈরি হয়েছে, তখন আপনি আধুনিকীকরণ শুরু করার জন্য পরবর্তী ধাপে যেতে পারেন।

৪. Spring Boot 4.x-এ আপগ্রেড করুন

১. এজেন্ট ম্যানেজার দিয়ে pom.xml আপডেট করুন।

এজেন্ট ম্যানেজারকে Spring Boot 4.0.1 (বা তার পরবর্তী সংস্করণ) এবং Java 25-এর জন্য pom.xml আপডেট করতে এবং ডিপেন্ডেন্সিগুলো আধুনিক করতে বলুন:

Help me update pom.xml to Spring Boot 4.0.1 (or later) and Java 25. Replace mysql-connector-java with mysql-connector-j, add jakarta.xml.bind-api, update jacoco-maven-plugin to 0.8.13, update spring-javaformat-maven-plugin to 0.0.41, ensure spring-boot-starter-cache is used instead of javax.cache, and add modular test starters (webmvc-test, data-jpa-test, restclient).

২. নেমস্পেস মাইগ্রেশন

প্যাকেজের নাম পরিবর্তনের মতো কঠিন কাজটি করার জন্য এজেন্ট ম্যানেজারকে বলুন:

Perform a project-wide migration from javax.* to jakarta.* for persistence, validation, and servlet packages. Also, update CacheConfiguration.java to use the Spring Boot 4.0.1 CacheManagerCustomizer interface.

৩. ফরম্যাটিং এবং বিল্ড ঠিক করুন

ফরম্যাটারটি চালান এবং মূল সোর্স কম্পাইল হচ্ছে কিনা তা যাচাই করতে একটি টেস্ট-স্কিপিং বিল্ড সম্পাদন করুন:

mvn spring-javaformat:apply
mvn clean package -Dmaven.test.skip=true

৫. ডেটা অ্যাক্সেস আধুনিকীকরণ করুন

পুরোনো রিপোজিটরিগুলোতে প্রায়শই এমন সব অপারেশনের জন্য ম্যানুয়াল @Query অ্যানোটেশন ব্যবহার করা হয়, যা আধুনিক Spring Data স্বয়ংক্রিয়ভাবে পরিচালনা করতে পারে।

১. লজিক (রিপোজিটরি) রিফ্যাক্টর করুন

  1. OwnerRepository.java খুলুন।
  2. এজেন্ট ম্যানেজারকে জিজ্ঞাসা করুন:
    Refactor OwnerRepository to extend JpaRepository. Remove redundant findById/save/findAll methods and update others to use Spring Data method naming conventions. ensure findById returns Optional<Owner>.
    
  3. এজেন্ট ম্যানেজার ইন্টারফেসটি রিফ্যাক্টর করে পূর্বে :
    public interface OwnerRepository extends Repository<Owner, Integer> {
        @Query("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id")
        Owner findById(@Param("id") Integer id);
    
        @Query("SELECT DISTINCT owner FROM Owner owner left join owner.pets WHERE owner.lastName LIKE :lastName%")
        Page<Owner> findByLastName(@Param("lastName") String lastName, Pageable pageable);
    }
    
    পরে :
    // Extends JpaRepository to inherit standard CRUD methods (findById, save, etc.)
    public interface OwnerRepository extends JpaRepository<Owner, Integer> {
    
        // Derived query method - no manual @Query needed!
        Page<Owner> findByLastNameStartingWith(String lastName, Pageable pageable);
    }
    

২. লজিক (কন্ট্রোলার) রিফ্যাক্টর করুন

যদি OwnerController.java ত্রুটি দেখা যায়, তাহলে এজেন্ট ম্যানেজারকে জিজ্ঞাসা করুন:

Fix compiler errors in OwnerController caused by findById returning Optional in modern JpaRepository. Use .orElseThrow() or .orElse(new Owner()) as appropriate.

পূর্বে :

Owner owner = this.owners.findById(ownerId);

পরে :

Owner owner = this.owners.findById(ownerId)
    .orElseThrow(() -> new IllegalArgumentException("Invalid ownerId: " + ownerId));

৬. আধুনিক জাভা বৈশিষ্ট্যগুলি সক্রিয় করুন

জাভা ২৫-এ স্প্রিং বুট ৪ ন্যূনতম কনফিগারেশনের মাধ্যমে থ্রুপুটে ব্যাপক উন্নতি ঘটায়। এই বৈশিষ্ট্যগুলির সুবিধা নিতে, আপনাকে প্রথমে নিশ্চিত করতে হবে যে আপনি জাভা ২৫ ব্যবহার করছেন।

১. SDKMAN ব্যবহার করে জাভা ২৫ সেট আপ করুন।

জাভা ২৫ দিয়ে অ্যাপ্লিকেশনটি চালাতে এবং ডায়াগনস্টিকসের জন্য jcmd মতো টুল ব্যবহার করতে, আপনার একটি জাভা ২৫ জেডিকে (JDK) প্রয়োজন হবে। এসডিকেম্যান (SDKMAN) হলো জাভাসহ একাধিক সফটওয়্যার ডেভেলপমেন্ট কিটের সমান্তরাল সংস্করণগুলো পরিচালনা করার একটি জনপ্রিয় টুল।

  • SDKMAN ইনস্টল করুন : যদি আপনার SDKMAN ইনস্টল করা না থাকে, তাহলে আপনার টার্মিনালে নিম্নলিখিত কমান্ডটি চালান:
    curl -s "https://get.sdkman.io" | bash
    source "$HOME/.sdkman/bin/sdkman-init.sh"
    
  • জাভা ২৫ ইনস্টল করুন : SDKMAN ইনস্টল হয়ে গেলে, Temurin Java 25 ইনস্টল ও সক্রিয় করুন:
    sdk install java 25-tem
    sdk use java 25-tem
    

২. অ্যাপ্লিকেশন কনফিগার করুন

  1. src/main/resources/application.properties খুলুন।
  2. এজেন্ট ম্যানেজারকে জিজ্ঞাসা করুন:
    Expose health and Prometheus endpoints in Actuator, and enable Virtual Threads for request processing.
    
  3. প্রস্তাবিত বৈশিষ্ট্যগুলি প্রয়োগ করুন:
    management.endpoints.web.exposure.include=health,prometheus
    spring.threads.virtual.enabled=true
    

এটা কি আসলেই কোনো কাজ করে?

ভার্চুয়াল থ্রেড সক্রিয় করলে, I/O-বাউন্ড টাস্কগুলোর জন্য ব্যয়বহুল OS থ্রেডের পরিবর্তে হালকা ও JVM-পরিচালিত ভার্চুয়াল থ্রেড ব্যবহৃত হয়, যা পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত করে। চলুন, অ্যাপটি বিল্ড ও রান করে এর কার্যকারিতা দেখে নেওয়া যাক।

ভার্চুয়াল থ্রেড ব্যবহৃত হচ্ছে কিনা তা যাচাই করুন।

প্রথমে, নিশ্চিত করুন যে আপনি অ্যাপটি প্যাকেজ করেছেন (যেমনটি 'Upgrade to Spring Boot 4.x'-এর ধাপ ৩-এ করা হয়েছে):

mvn clean package -Dmaven.test.skip=true

এরপরে, অ্যাপটিকে ব্যাকগ্রাউন্ডে চালু করতে, এর প্রসেস আইডি (PID) পেতে, Apache Benchmark ( ab ) দিয়ে এতে লোড পাঠাতে এবং jcmd দিয়ে ভার্চুয়াল থ্রেডের ব্যবহার পরীক্ষা করতে নিম্নলিখিত কমান্ডগুলো চালান।

# Start app in background and wait a few seconds for it to initialize
java -jar target/spring-petclinic-*.jar &
echo "Waiting 15s for app to start..."
sleep 15
# Get PID
PID=$(jps -l | grep spring-petclinic | awk '{print $1}')
echo "App running with PID: $PID"
# Start load generator in background to ensure virtual threads are created
echo "Simulating 100 concurrent users in background..."
ab -n 100 -c 100 http://localhost:8080/owners/find > /dev/null 2>&1 &
# Check for virtual threads under load
echo "Checking for virtual threads with jcmd:"
sleep 5 # wait for load to hit server
jcmd $PID Thread.print | grep VirtualThread
# Clean up
echo "Stopping background load generator and app..."
pkill ab
kill $PID

যদি ভার্চুয়াল থ্রেডগুলি সঠিকভাবে সক্রিয় করা থাকে, তাহলে jcmd থ্রেড স্ট্যাক ট্রেস আউটপুট করবে যাতে VirtualThread অন্তর্ভুক্ত থাকবে, যা নিশ্চিত করে যে JVM সক্রিয়ভাবে লাইটওয়েট থ্রেড শিডিউল করছে:

"VirtualThread-unblocker" #53 daemon prio=5
...

এই ডায়াগনস্টিকটি নিশ্চিত করে যে অনুরোধগুলি পরিচালনা করার জন্য ভার্চুয়াল থ্রেড ব্যবহার করা হচ্ছে। এখন এর পারফরম্যান্সের উপর প্রভাব পর্যালোচনা করা যাক।

ভিত্তি স্থাপন করুন

একই সাথে ১০০ জন ব্যবহারকারীকে অনুকরণ করতে অ্যাপাচি বেঞ্চমার্ক চালান:

ab -n 5000 -c 100 http://localhost:8080/owners/find
  • আউটপুট (তুলনা) :
    # Virtual Threads OFF
    Requests per second:    1047.45 [#/sec] (mean)
    Time per request:       95.470 [ms] (mean)
    
    # Virtual Threads ON
    Requests per second:    1317.12 [#/sec] (mean)
    Time per request:       75.923 [ms] (mean)
    
  • প্রত্যাশিত ফলাফল : ডিবি ব্লকিংয়ের সময় থ্রেড-সুইচিং ওভারহেড দূর করার মাধ্যমে থ্রুপুট ২৫% বৃদ্ধি এবং ল্যাটেন্সি ২০% হ্রাস

প্রভাব যাচাই করুন

এটি চালান : রানটাইম প্রয়োজনীয় শিডিউলিং পরিকাঠামো লোড করেছে কিনা তা যাচাই করুন।

jcmd <PID> VM.class_hierarchy | grep VirtualThread
  • আউটপুট :
    java.lang.VirtualThread
    jdk.management.VirtualThreadSchedulerMXBean
    
  • ফলাফল : জাভা ২৫ রানটাইম যে প্রজেক্ট লুমের বৈশিষ্ট্যগুলো সম্পর্কে সম্পূর্ণরূপে অবগত এবং তা ব্যবহার করছে, তার যাচাইকরণ।

সারসংক্ষেপ: কখন ভার্চুয়াল থ্রেড ব্যবহার করবেন?

দৃশ্যকল্প

সুপারিশ করবেন?

কেন

I/O / DB

হ্যাঁ

সর্বোচ্চ সুবিধা; অপেক্ষা করার সময় থ্রেডগুলো "অনুপস্থিতি" জানায়।

পরিমাপযোগ্যতা

হ্যাঁ

একটিমাত্র নোডে একযোগে ১০ হাজারেরও বেশি অনুরোধ সামাল দেয়।

সিপিইউ ভারী

না

সরাসরি গণনার জন্য প্ল্যাটফর্ম থ্রেড ব্যবহার করুন।

৭. (ঐচ্ছিক) টেস্টগুলো ঠিক করুন এবং তৈরি করুন

আধুনিকীকরণের জন্য নতুন প্যাকেজের নাম, এপিআই এবং সেরা অনুশীলনগুলোর সাথে সামঞ্জস্য রেখে টেস্টগুলো আপডেট করা প্রয়োজন। নতুন টেস্ট তৈরি করতে এবং সার্বিক টেস্ট কভারেজ উন্নত করতে এজেন্ট ম্যানেজার ব্যবহার করার জন্যও এটি একটি উপযুক্ত সময়।

পুরোনো পরীক্ষাগুলো ঠিক করুন

প্যাকেজের নাম পরিবর্তন ( javax থেকে jakarta ) এবং API পরিবর্তনের (রিপোজিটরিতে Optional রিটার্ন টাইপ) কারণে src/test ফোল্ডারটিতে সম্ভবত কম্পাইলেশন ত্রুটি দেখা দিয়েছে। সমস্ত টেস্ট ফাইলে এই সমস্যাগুলো সমাধান করার জন্য এজেন্ট ম্যানেজারকে বলুন:

Fix compilation errors in src/test. Replace deprecated @MockBean with @MockitoBean. Update test imports for WebMvcTest and DataJpaTest to their new Spring Boot 4 modular tags. Update mocks (like given(owners.findById(...))) to return Optional.of(owner).

এই নির্দেশটি এজেন্ট ম্যানেজারকে করতে নির্দেশ দেয়:

  • টেস্ট ইম্পোর্টগুলো jakarta.* -এ স্থানান্তর করুন।
  • অপ্রচলিত Spring টেস্ট অ্যানোটেশনগুলোকে আধুনিক সমতুল্য দিয়ে প্রতিস্থাপন করুন।
  • রিপোজিটরি মেথডগুলোর সাথে সামঞ্জস্য রেখে মক ডেফিনিশনগুলো আপডেট করুন, যা এখন Optional রিটার্ন করছে। Optional .

কভারেজ উন্নত করতে নতুন পরীক্ষা তৈরি করুন

আধুনিকীকরণের সময়, আপনি টেস্ট কভারেজে ঘাটতি খুঁজে পেতে পারেন। এজেন্ট ম্যানেজার আপনাকে নির্দিষ্ট মেথড বা ক্লাসের জন্য নতুন টেস্ট তৈরি করতে সাহায্য করতে পারে, যাতে আপনার আধুনিকীকৃত অ্যাপ্লিকেশনটি ভালোভাবে পরীক্ষিত হয়।

উদাহরণস্বরূপ, OwnerController.java তে এমন একটি মেথড নির্বাচন করুন যেটির পর্যাপ্ত টেস্টিং নেই, এবং এজেন্ট ম্যানেজারকে জিজ্ঞাসা করুন:

Generate a JUnit 5 test for this method using MockMvc.

এজেন্ট ম্যানেজার একটি নতুন টেস্ট মেথড তৈরি করবে যা আপনি OwnerControllerTests.java তে যোগ করতে পারবেন।

বিল্ড যাচাই করুন এবং পরীক্ষা চালান

বিদ্যমান টেস্টগুলো ঠিক করার পর এবং প্রয়োজনে নতুন টেস্ট তৈরি করার পর, সবকিছু পাস করছে কিনা তা নিশ্চিত করতে সম্পূর্ণ টেস্ট স্যুটটি চালান:

mvn clean test

যাচাইকরণ চেকলিস্ট

একটি সফল আধুনিকীকরণ নিশ্চিত করতে, যা আপনার দলকে কোডবেস (জাভা ২৫ / স্প্রিং বুট ৪) নিয়ে কার্যকরভাবে কাজ করতে সাহায্য করবে, নিম্নলিখিত বিষয়গুলো যাচাই করুন:

  • রানটাইম এবং বিল্ড :
    • pom.xml টার্গেট 25 .
    • pom.xml parent হলো spring-boot-starter-parent ভার্সন 4.0.1
    • build.gradle ফাইলটি Java 25 এবং Spring Boot 4.0.1-কে টার্গেট করে তৈরি।
  • জাকার্তা EE কমপ্লায়েন্স :
    • বিশ্বব্যাপী import javax. লিখে অনুসন্ধান করুন। এতে `persistence`, `servlet`, বা `validation` প্যাকেজগুলির (যা jakarta.* -এ স্থানান্তরিত হয়েছে) জন্য ০টি ফলাফল আসা উচিত।
  • পরীক্ষার মানদণ্ড :
    • টেস্টগুলোতে পুরোনো @MockBean MockBean-এর পরিবর্তে @MockitoBean ব্যবহার করা হয়।
    • টেস্ট ক্লাসগুলো org.junit.jupiter.api.Test (JUnit 5) ইম্পোর্ট করে, org.junit.Test (JUnit 4) নয়।
    • রিপোজিটরি মকগুলো সরাসরি এনটিটি (entity) রিটার্ন না করে Optional.of(entity) রিটার্ন করে।

৮. পরবর্তী পদক্ষেপ

এই কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন! আপনি সফলভাবে শিখেছেন কিভাবে এজেন্ট ম্যানেজার ব্যবহার করে একটি লিগ্যাসি জাভা অ্যাপ্লিকেশনকে আধুনিকীকরণ করা যায়।

আরও পড়ার জন্য নির্দ্বিধায় এই অন্যান্য নথি ও উপকরণগুলো পর্যালোচনা করুন: