Asynchronous Processing হল একটি গুরুত্বপূর্ণ ফিচার যা আপনাকে দীর্ঘ-running HTTP রিকোয়েস্ট প্রক্রিয়াকরণের সময় প্রধান থ্রেড ব্লক না করে ক্লায়েন্টকে দ্রুত প্রতিক্রিয়া প্রদান করতে সহায়তা করে। Spring MVC তে DeferredResult এবং Callable এর মাধ্যমে অ্যাসিঙ্ক্রোনাস প্রক্রিয়াকরণ করা যায়, যা সার্ভারকে বিভিন্ন রিকোয়েস্ট হ্যান্ডলিংয়ের জন্য অপ্টিমাইজড রাখতে সাহায্য করে। এর মাধ্যমে, কোনো নির্দিষ্ট সময়ের জন্য ওয়েট করার পরিবর্তে, ক্লায়েন্ট দ্রুত একটি রেসপন্স পেতে পারে।
1. DeferredResult
DeferredResult হল Spring MVC তে ব্যবহারকারী বা ক্লায়েন্টকে asynchronous রেসপন্স প্রদান করার জন্য ব্যবহৃত একটি উপাদান। এটি দীর্ঘ-running প্রক্রিয়ার শেষে যখন রেসপন্স প্রস্তুত হবে, তখন রেসপন্স পাঠানোর সুযোগ দেয়। ক্লায়েন্টের জন্য তাৎক্ষণিক প্রতিক্রিয়া দেয় এবং পরবর্তীতে রেসপন্স প্রদান করে।
DeferredResult এর ব্যবহার:
উদাহরণ:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.context.request.async.DeferredResult;
@Controller
public class AsyncController {
@GetMapping("/deferred-result")
public DeferredResult<String> handleRequest() {
DeferredResult<String> deferredResult = new DeferredResult<>();
// Simulating a long running task in another thread (e.g., calling an external service)
new Thread(() -> {
try {
Thread.sleep(5000); // Simulate long-running task (5 seconds)
deferredResult.setResult("Processed after 5 seconds!"); // Set the result
} catch (InterruptedException e) {
deferredResult.setErrorResult("Error processing request");
}
}).start();
return deferredResult;
}
}
এখানে:
DeferredResult: এটি ক্লায়েন্টের জন্য রিকোয়েস্টের ফলাফল অপেক্ষায় থাকে।setResult(): অ্যাসিঙ্ক্রোনাস প্রসেসিংয়ের শেষে ক্লায়েন্টকে রেসপন্স পাঠানো হয়।
ফলাফল:
- 5 সেকেন্ড পর, ক্লায়েন্টকে
"Processed after 5 seconds!"রেসপন্স দেওয়া হবে, কিন্তু সেই সময় ক্লায়েন্টের থ্রেড ব্লক হবে না।
2. Callable
Callable Spring MVC তে আরও একটি পদ্ধতি যা অ্যাসিঙ্ক্রোনাস রিকোয়েস্ট হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। Callable ব্যবহারের সময়, Spring MVC ক্লায়েন্টের থ্রেড ব্লক না করে এক্সিকিউশন হ্যান্ডলারের মাধ্যমে এটি অন্য থ্রেডে প্রক্রিয়া করবে এবং যখন সম্পন্ন হবে তখন রেসপন্স প্রদান করবে।
Callable এর ব্যবহার:
উদাহরণ:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class AsyncController {
@GetMapping("/callable")
public Callable<String> handleRequest() {
return () -> {
// Simulating a long running task
Thread.sleep(5000); // Simulate 5 seconds of processing
return "Processed after 5 seconds!";
};
}
}
এখানে:
Callable: একটি ফাংশনাল ইন্টারফেস যা একটি অ্যাসিঙ্ক্রোনাস প্রসেস সম্পন্ন হলে একটি ফলাফল প্রদান করবে।Thread.sleep(): এখানে শুধুমাত্র দীর্ঘ-running প্রসেসের জন্য সিমুলেশন করা হয়েছে।
ফলাফল:
- ক্লায়েন্ট একটি রিকোয়েস্ট পাঠালে, সার্ভার প্রসেসিং শুরু করবে, কিন্তু প্রধান থ্রেড ব্লক না হয়ে অন্য থ্রেডে প্রসেসিং হবে। 5 সেকেন্ড পর ক্লায়েন্ট
"Processed after 5 seconds!"রেসপন্স পাবে।
Spring MVC তে Asynchronous Processing কনফিগারেশন
Spring MVC তে অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্রিয় করতে @EnableAsync অ্যানোটেশন ব্যবহার করতে হয়।
ধাপ ১: Asynchronous Processing সক্রিয় করা
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync
public class AsyncConfig {
// Async configuration (if needed)
}
@EnableAsync অ্যানোটেশন ব্যবহার করে অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্রিয় করা হয়।
ধাপ ২: Application Configuration
Spring Boot-এ সাধারণত অ্যাসিঙ্ক্রোনাস প্রসেসিং কনফিগার করতে অতিরিক্ত কনফিগারেশন প্রয়োজন হয় না, তবে যদি আপনি কাস্টম থ্রেড পুল বা অন্যান্য কনফিগারেশন করতে চান, তাহলে নিম্নলিখিত কনফিগারেশন যুক্ত করতে পারেন:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
public class ThreadConfig {
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(100);
executor.setQueueCapacity(25);
executor.setThreadNamePrefix("Async-");
executor.initialize();
return executor;
}
}
এটি থ্রেড পুল কনফিগার করবে যাতে অ্যাসিঙ্ক্রোনাস প্রসেসিংয়ের জন্য পর্যাপ্ত থ্রেড ব্যবহার করা যায়।
DeferredResult এবং Callable এর পার্থক্য
| বৈশিষ্ট্য | DeferredResult | Callable |
|---|---|---|
| ব্যবহার | যেকোনো সময় রিকোয়েস্টের ফলাফল প্রাপ্তি পর্যন্ত অপেক্ষা করে। | সরাসরি থ্রেডে কাজ করতে দেয় এবং তাৎক্ষণিকভাবে রিকোয়েস্ট রিটার্ন হয়। |
| রিকোয়েস্ট ব্লকিং | রিকোয়েস্ট ব্লক করা হয় না, তবে ফলাফল আসার পর ক্লায়েন্টকে রেসপন্স দেওয়া হয়। | রিকোয়েস্ট ব্লক না হয়ে, প্রসেসিং অন্য থ্রেডে চলে। |
| প্রয়োগের জায়গা | দীর্ঘ-running প্রসেসিং (যেমন ফাইল ডাউনলোড বা থার্ড-পার্টি সার্ভিস কল)। | সহজ প্রসেসিং যেমন ডেটাবেস অপারেশন বা লজিক্যাল প্রসেসিং। |
| ফলাফল প্রদান | setResult() বা setErrorResult() ব্যবহার করে। | সরাসরি return এর মাধ্যমে ফলাফল প্রদান। |
উপসংহার
DeferredResultএবংCallableSpring MVC তে অ্যাসিঙ্ক্রোনাস প্রক্রিয়াকরণ ব্যবস্থাপনা করার জন্য ব্যবহৃত হয়।DeferredResultবেশিরভাগ ক্ষেত্রেই যখন লম্বা-running অপারেশন চালানো হয়, তখন এটি ব্যবহার করা হয় এবং সেটির শেষে ফলাফল ফেরত দেওয়া হয়।Callableতুলনামূলকভাবে সহজ অ্যাসিঙ্ক্রোনাস কাজের জন্য ব্যবহৃত হয়, যেখানে অপারেশনটি অন্য থ্রেডে চলে এবং ফাইনাল রেসপন্স দেওয়া হয়।
এই দুটি উপাদান Spring MVC অ্যাপ্লিকেশনগুলোকে উচ্চ পারফরম্যান্স, স্কেলেবিলিটি এবং দ্রুত রেসপন্স দেয়, বিশেষত যখন ওয়েব অ্যাপ্লিকেশনটি অনেক রিকোয়েস্ট এবং দীর্ঘ-running প্রক্রিয়া হ্যান্ডল করে।
Read more