উদাহরণ সহ Asynchronous Request Handling

Spring MVC এর মধ্যে Asynchronous Request Handling - স্প্রিং এমভিসি (Spring MVC) - Java Technologies

318

Asynchronous Request Handling Spring MVC তে একটি শক্তিশালী বৈশিষ্ট্য, যা সার্ভারের রেসপন্স দেওয়ার সময়কে উন্নত করে এবং দীর্ঘ-running প্রক্রিয়াগুলির জন্য অ্যাপ্লিকেশনকে আরও প্রতিক্রিয়া (responsive) রাখে। যখন আপনি asynchronous মডেল ব্যবহার করেন, তখন সার্ভার মূল থ্রেডটি ব্লক না করে রিকোয়েস্ট প্রসেস করতে পারে এবং অন্যান্য রিকোয়েস্ট প্রসেস করতে সক্ষম হয়।

Spring MVC তে Asynchronous Request Handling ব্যবহার করার জন্য, আপনাকে কিছু নির্দিষ্ট কনফিগারেশন এবং পরিবর্তন করতে হয়, যাতে রিকোয়েস্টগুলো ইন্টারনাল থ্রেডের মাধ্যমে প্রসেস করা যায় এবং তার রেসপন্স রিটার্ন করতে পারে যখন তা প্রস্তুত হবে।


১. Spring MVC তে Asynchronous Request Handling সেটআপ করা

Spring MVC তে Asynchronous Request Handling বাস্তবায়ন করার জন্য @Async এবং Callable বা DeferredResult ব্যবহার করা হয়।

@Async ব্যবহার করে Asynchronous Request Handling

Spring MVC তে @Async অ্যানোটেশন ব্যবহারের মাধ্যমে আপনার কন্ট্রোলারের মেথডকে অ্যাসিনক্রোনাস করা যেতে পারে। এটি ব্যবহার করলে মেথডটি separate thread এ রান করবে এবং main thread ব্লক হবে না।

প্রথমে Asynchronous Support সক্রিয় করা

Spring Boot ব্যবহার করলে, এটি স্বয়ংক্রিয়ভাবে Asynchronous সাপোর্ট সক্ষম করে, তবে Spring MVC তে এটি কনফিগার করার জন্য, @EnableAsync অ্যানোটেশন ব্যবহার করতে হবে।

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

@Configuration
@EnableAsync
public class AsyncConfig {
    // Enable async processing
}

@Async ব্যবহার করে কন্ট্রোলার মেথড

import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.CompletableFuture;

@RestController
public class AsyncController {

    @Async
    @GetMapping("/async-task")
    public CompletableFuture<String> asyncTask() {
        // Simulate a long-running task
        try {
            Thread.sleep(5000); // 5 seconds delay
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return CompletableFuture.completedFuture("Task Completed");
    }
}

ব্যাখ্যা:

  • @Async অ্যানোটেশন কন্ট্রোলারের মেথডের উপর ব্যবহার করা হয়েছে যাতে মেথডটি আলাদা থ্রেডে রান করে।
  • CompletableFuture: এটি asynchronous মেথডের রিটার্ন টাইপ, যা future রেসপন্স প্রতিনিধিত্ব করে।

এখন আপনি /async-task এ রিকোয়েস্ট পাঠালে, সার্ভার 5 সেকেন্ড অপেক্ষা করে তার রেসপন্স প্রদান করবে, কিন্তু মূল থ্রেড ব্লক হবে না। এটি অন্যান্য রিকোয়েস্ট প্রসেস করতে সক্ষম থাকবে।


২. Callable ব্যবহার করে Asynchronous Request Handling

Spring MVC তে Callable এর সাহায্যে আপনি একটি কন্ট্রোলার মেথডে asynchronous রিকোয়েস্ট প্রসেসিং করতে পারেন। এটি মূলত রিকোয়েস্ট প্রসেসিং সময়কে কমাতে সাহায্য করে এবং I/O-bound tasks এর জন্য উপকারী।

Callable ব্যবহার করে কন্ট্রোলার মেথড

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.Callable;

@RestController
public class CallableController {

    @GetMapping("/callable-task")
    public Callable<String> callableTask() {
        return () -> {
            // Simulate a long-running task
            Thread.sleep(5000); // 5 seconds delay
            return "Callable Task Completed";
        };
    }
}

ব্যাখ্যা:

  • Callable: এটি একটি functional interface যা একটি long-running task encapsulate করে এবং asynchronous execution এর জন্য উপযুক্ত।
  • রিকোয়েস্ট আসার সাথে সাথে Callable অবজেক্টটি রান হবে, কিন্তু আসল সার্ভার থ্রেডটি ব্লক হবে না।

এই কন্ট্রোলারের মাধ্যমে, আপনি /callable-task এ রিকোয়েস্ট পাঠালে, সার্ভার 5 সেকেন্ড পর রেসপন্স করবে, কিন্তু অন্য রিকোয়েস্টগুলোর প্রসেসিং চলতে থাকবে।


৩. DeferredResult ব্যবহার করে Asynchronous Request Handling

DeferredResult একটি কমপ্লেক্স অ্যাসিনক্রোনাস টুল যা আপনি request processingresponse generation এর মধ্যে asynchronous কাজ করতে পারেন। এটি কখনও কখনও Callable এর চেয়ে বেশি নিয়ন্ত্রণ এবং flexibility প্রদান করে।

DeferredResult ব্যবহার করে কন্ট্রোলার মেথড

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;

@RestController
public class DeferredResultController {

    @GetMapping("/deferred-result-task")
    public DeferredResult<String> deferredResultTask() {
        DeferredResult<String> output = new DeferredResult<>();

        // Simulate a long-running task in another thread
        new Thread(() -> {
            try {
                Thread.sleep(5000); // 5 seconds delay
                output.setResult("DeferredResult Task Completed");
            } catch (InterruptedException e) {
                output.setErrorResult("Error occurred");
            }
        }).start();

        return output; // Return DeferredResult
    }
}

ব্যাখ্যা:

  • DeferredResult: এটি রিকোয়েস্টের response আলাদা থ্রেডে প্রস্তুত হতে দেয়। এই থ্রেডটি মূল থ্রেডের বাইরে চলবে এবং রিকোয়েস্ট সম্পূর্ণ হওয়ার পর রেসপন্স ফেরত করবে।
  • output.setResult(): এটি DeferredResult অবজেক্টের মাধ্যমে আসল রেসপন্স সেট করা হয়।
  • output.setErrorResult(): কোন সমস্যা হলে DeferredResult এর মাধ্যমে error result ফেরত দেওয়া হয়।

এই কন্ট্রোলারের মাধ্যমে, /deferred-result-task এ রিকোয়েস্ট পাঠালে সার্ভার 5 সেকেন্ড পরে রেসপন্স করবে এবং থ্রেড ব্লক হবে না।


৪. Spring MVC তে Asynchronous Request Handling কনফিগারেশন

Spring MVC তে asynchronous হ্যান্ডলিং সক্ষম করতে, @EnableAsync এবং async supported=true কনফিগারেশন ব্যবহার করা হয়।

Java-based Configuration (WebConfig):

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(30000); // Set the timeout for asynchronous requests
    }
}

ব্যাখ্যা:

  • configureAsyncSupport(): এই মেথডটি asynchronous request processing কনফিগার করার জন্য ব্যবহার করা হয়।
  • setDefaultTimeout(): এই মেথডের মাধ্যমে আমরা asynchronous রিকোয়েস্টের জন্য টাইমআউট নির্ধারণ করতে পারি।

উপসংহার

Spring MVC তে Asynchronous Request Handling দ্বারা আপনি দীর্ঘ-running কার্যক্রমের জন্য সার্ভারের মূল থ্রেড ব্লক না করে কার্যক্ষমতা বাড়াতে পারেন। এর জন্য আপনি @Async, Callable, বা DeferredResult ব্যবহার করতে পারেন। এই পদ্ধতিগুলি ওয়েব অ্যাপ্লিকেশনকে আরও প্রতিক্রিয়া (responsive) এবং কার্যকরী করে তোলে, বিশেষত যখন আপনার অ্যাপ্লিকেশনটির I/O-bound বা সময়সাপেক্ষ কার্যক্রম থাকে।

Content added By
Promotion

Are you sure to start over?

Loading...