Spring MVC-তে Asynchronous Request Handling (অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং) হল একটি প্রক্রিয়া যেখানে সার্ভার ক্লায়েন্টের রিকোয়েস্টের জন্য অপেক্ষা না করে অন্যান্য কাজ করতে পারে। এটি বিশেষত দীর্ঘ সময় ধরে চলা কাজের জন্য উপকারী, যেমন ডেটাবেস থেকে বড় ডেটা আহরণ করা, বড় ফাইল আপলোড করা, বা থার্ড-পার্টি API কল করা। অ্যাসিনক্রোনাস প্রসেসিং সার্ভারের সম্পদ ব্যবস্থাপনা উন্নত করে এবং ক্লায়েন্টের জন্য দ্রুত প্রতিক্রিয়া প্রদান করে।
Spring MVC অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং এর জন্য @Async, DeferredResult, এবং Callable এর মতো টুলস প্রদান করে।
1. Callable ব্যবহার করে Asynchronous Request Handling
Spring MVC 3.2 এ Callable ইন্টারফেসটি আনা হয়, যা অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং সম্ভব করে তোলে। Callable ব্যবহারের মাধ্যমে, একটি রিকোয়েস্ট কন্ট্রোলারের মেথডে সম্পূর্ণভাবে প্রক্রিয়া না হওয়া পর্যন্ত ব্লক করবে না, বরং তা অ্যাসিনক্রোনাসভাবে প্রসেস হবে এবং পরবর্তীতে রেসপন্স ফেরত যাবে।
উদাহরণ: Callable ব্যবহার করে অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং
Controller:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.Callable;
@RestController
public class AsyncController {
@GetMapping("/async")
public Callable<String> handleAsyncRequest() {
return () -> {
// Simulating a long-running process
Thread.sleep(5000); // Sleep for 5 seconds to simulate a delay
return "Hello, this is an asynchronous response!";
};
}
}
এখানে, Callable রিকোয়েস্ট হ্যান্ডলারের কাজ শেষ না হওয়া পর্যন্ত এটি সার্ভারের থ্রেড ব্লক করবে না। Spring MVC এটি অ্যাসিনক্রোনাসভাবে পরিচালনা করে এবং অবশেষে রেসপন্স প্রদান করে।
Key Points:
Callable: এটি একটি ইন্টারফেস যা অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং করতে ব্যবহৃত হয়।- Spring MVC automatically পরিচালনা করে অ্যাসিনক্রোনাস রিকোয়েস্ট।
2. DeferredResult ব্যবহার করে Asynchronous Request Handling
DeferredResult Spring MVC 3.2 তে ব্যবহৃত আরেকটি শক্তিশালী টুল, যা অ্যাসিনক্রোনাস প্রসেসিং প্রদান করে এবং ফলাফলটি সময়মত রিটার্ন না হওয়া পর্যন্ত ক্লায়েন্ট অপেক্ষা করতে পারে। এটি সাধারণত এক্সটার্নাল সার্ভিস বা সময়সাপেক্ষ প্রসেসিংয়ের জন্য ব্যবহৃত হয়।
উদাহরণ: DeferredResult ব্যবহার করে অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং
Controller:
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")
public DeferredResult<String> handleDeferredRequest() {
DeferredResult<String> deferredResult = new DeferredResult<>();
// Simulating a time-consuming task
new Thread(() -> {
try {
Thread.sleep(5000); // Sleep for 5 seconds to simulate a delay
deferredResult.setResult("This is an asynchronous response using DeferredResult!");
} catch (InterruptedException e) {
deferredResult.setErrorResult("Error occurred while processing the request.");
}
}).start();
return deferredResult;
}
}
এখানে, DeferredResult একটি অ্যাসিনক্রোনাস রিকোয়েস্টের জন্য ব্যবহার করা হয়েছে যা প্রধান থ্রেডকে ব্লক না করে অন্য একটি থ্রেডে কাজটি চালাতে সাহায্য করে। রিকোয়েস্ট প্রক্রিয়া সম্পন্ন হওয়ার পর setResult() মেথডের মাধ্যমে রেসপন্সটি ফেরত পাঠানো হয়।
Key Points:
DeferredResultব্যবহার করে দীর্ঘ সময় নেওয়া কাজের জন্য ক্লায়েন্টকে অপেক্ষা করতে বলা হয়।- Threading: নতুন থ্রেডে কাজটি সম্পাদিত হয়ে পরে ফলাফল সেট করা হয়।
3. @Async ব্যবহার করে Asynchronous Processing
@Async হল Spring Framework-এর একটি অ্যানোটেশন যা মেথড বা ক্লাসকে অ্যাসিনক্রোনাস প্রক্রিয়াকরণে রূপান্তরিত করে। এটি সাধারণত দীর্ঘ-running প্রসেসিংয়ের জন্য ব্যবহৃত হয়, যাতে থ্রেড ব্লক না হয় এবং দ্রুত প্রতিক্রিয়া প্রদান করা যায়।
Spring MVC তে @Async ব্যবহার করে আপনি অ্যাসিনক্রোনাস কাজের জন্য স্পেসিফিক মেথড বা পুরো ক্লাসকে অ্যাসিনক্রোনাস করতে পারেন।
উদাহরণ: @Async ব্যবহার করে অ্যাসিনক্রোনাস কাজ
Controller:
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class AsyncServiceController {
@GetMapping("/async-service")
public String handleRequest() {
asyncService.processAsyncTask();
return "Request is being processed asynchronously";
}
@Async
public void processAsyncTask() {
try {
// Simulating a long-running task
Thread.sleep(5000);
System.out.println("Async Task completed!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
এখানে @Async ব্যবহারের মাধ্যমে processAsyncTask মেথডটি অ্যাসিনক্রোনাসভাবে কার্যকর করা হচ্ছে। মেথডটি নিজে একটি নতুন থ্রেডে কাজটি সম্পন্ন করবে, যার ফলে মূল থ্রেড ব্লক হবে না।
Key Points:
@Asyncব্যবহার করে একটি মেথডকে অ্যাসিনক্রোনাস করা যায়।- Thread management: Spring
TaskExecutorব্যবহার করে থ্রেডগুলি পরিচালনা করে।
4. Configuration for Asynchronous Request Handling
Spring MVC অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং কাজ করার জন্য আপনার অ্যাপ্লিকেশনে অ্যাসিনক্রোনাস প্রসেসিং কনফিগার করতে হবে।
AsyncConfig.java:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(3);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("Async-");
executor.initialize();
return executor;
}
}
এখানে, ThreadPoolTaskExecutor ব্যবহৃত হয়েছে অ্যাসিনক্রোনাস কাজের জন্য থ্রেড পুল কনফিগার করতে।
উপসংহার
Spring MVC তে Asynchronous Request Handling ব্যবহার করা অ্যাপ্লিকেশনকে আরও দক্ষ, দ্রুত এবং স্কেলযোগ্য করে তোলে। Callable, DeferredResult, এবং @Async তিনটি পদ্ধতিই অ্যাসিনক্রোনাস কাজের জন্য ব্যবহৃত হয় এবং এগুলির মাধ্যমে Spring MVC অ্যাপ্লিকেশন অ্যাসিনক্রোনাস রিকোয়েস্ট ও রেসপন্স হ্যান্ডল করতে সক্ষম হয়। এতে সার্ভার ব্লক হয় না এবং ক্লায়েন্টের জন্য দ্রুত প্রতিক্রিয়া প্রদান করা যায়, বিশেষত বড় ডেটা প্রসেসিং বা এক্সটার্নাল API কলের ক্ষেত্রে।
Asynchronous Request Handling Spring MVC তে একটি প্রক্রিয়া যা রিকোয়েস্ট প্রক্রিয়া এবং রেসপন্স তৈরির সময় ব্লক না হয়ে প্রসেসিং করা হয়। সাধারণ HTTP রিকোয়েস্টে, সার্ভার ক্লায়েন্টের রিকোয়েস্ট সম্পূর্ণভাবে প্রক্রিয়া না করা পর্যন্ত অপেক্ষা করে থাকে, কিন্তু Asynchronous রিকোয়েস্ট হ্যান্ডলিং-এর মাধ্যমে, সার্ভার রিকোয়েস্ট প্রক্রিয়া করার সময় অন্যান্য রিকোয়েস্ট গ্রহণ করতে পারে এবং দীর্ঘ চলমান কাজের জন্য অপেক্ষা না করে কেবল ফলাফল প্রদান করতে পারে।
এটি সাধারণত ওয়েব অ্যাপ্লিকেশনে বড় পরিমাণের ডেটা বা সময়সাপেক্ষ কাজ প্রক্রিয়া করার সময় ব্যবহৃত হয়, যেখানে সার্ভারকে দীর্ঘ সময় অপেক্ষা করতে হবে এবং এভাবে রিকোয়েস্ট প্রক্রিয়াকরণের দক্ষতা বৃদ্ধি পায়।
Asynchronous Request Handling কেন গুরুত্বপূর্ণ?
- Non-blocking Execution: ক্লায়েন্ট এবং সার্ভার একে অপরকে ব্লক না করে আলাদা আলাদা কাজ করতে পারে। এটি সার্ভারের জন্য আরও কার্যকর এবং স্কেলেবেল।
- Improved Performance: বড় পরিমাণে দীর্ঘ কার্যকরী কাজ (যেমন ডেটাবেস কুয়েরি, ফাইল আপলোড বা ডাউনলোড) প্রক্রিয়া করার সময় ব্যবহারকারী ইন্টারফেসটি প্রতিক্রিয়া দেয় এবং সার্ভার অন্যান্য রিকোয়েস্ট হ্যান্ডল করতে পারে।
- Scalability: অ্যাপ্লিকেশনটি আরও রিসোর্স-অভিযোজিত হতে পারে, কারণ একই সময়ে একাধিক কাজ সম্পাদন করা সম্ভব হয়।
- Resource Management: সার্ভার রিসোর্স ব্যবহার উন্নত হয় এবং একই সময়ে অনেকগুলি রিকোয়েস্ট সম্পন্ন করা যেতে পারে।
Spring MVC তে Asynchronous Request Handling কনফিগারেশন
Spring MVC তে Asynchronous Request Handling সক্ষম করতে, @Async অ্যানোটেশন এবং DeferredResult ব্যবহার করা হয়। Spring MVC 3.2 এর পর থেকে, Spring ফ্রেমওয়ার্কে এই ফিচারটি ইনক্লুড করা হয়েছে।
Step 1: Asynchronous Method with @Async
@Async অ্যানোটেশন ব্যবহার করে, আপনি একটি মেথডকে অ্যাসিঙ্ক্রোনাস কার্যকলাপ হিসেবে চিহ্নিত করতে পারেন। Spring অ্যাসিঙ্ক্রোনাস কাজটি আলাদা থ্রেডে প্রক্রিয়া করবে, যাতে মূল থ্রেডটি ব্লক না হয়।
HomeController.java (Asynchronous Method উদাহরণ):
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("/longProcess")
public String longProcess() {
longRunningTask();
return "Request is being processed asynchronously!";
}
@Async
public void longRunningTask() {
try {
// এখানে দীর্ঘ সময় নেয় এমন কাজ যেমন ডেটাবেস কুয়েরি বা ফাইল আপলোড/ডাউনলোড করা যেতে পারে।
Thread.sleep(5000); // 5 সেকেন্ডের জন্য থ্রেড স্লিপ
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Long running task finished!");
}
}
ব্যাখ্যা:
@Async: এই অ্যানোটেশনটি যেকোনো মেথডে ব্যবহৃত হলে, সেটি অ্যাসিঙ্ক্রোনাস ভাবে রান হবে, অর্থাৎ কাজটি অন্য থ্রেডে রান হবে এবং মূল থ্রেড ব্লক হবে না।longRunningTask(): এটি একটি দীর্ঘ-running টাস্ক যা ৫ সেকেন্ড সময় নেবে, কিন্তু সার্ভার অন্যান্য রিকোয়েস্ট হ্যান্ডল করতে সক্ষম থাকবে।
Step 2: Enable Async Support in Spring Configuration
Spring MVC তে অ্যাসিঙ্ক্রোনাস কার্যকলাপ ব্যবহারের জন্য @EnableAsync অ্যানোটেশনটি ব্যবহার করে অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্ষম করতে হবে।
AppConfig.java (Configuration):
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync // @Async অ্যানোটেশন সক্রিয় করতে
public class AppConfig {
}
ব্যাখ্যা:
@EnableAsync: এটি Spring অ্যাপ্লিকেশন কনটেক্সটে অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্রিয় করে। এটি Spring Context-এ কাস্টম থ্রেডে কাজ করার জন্য ইন্টার্নাল রিসোর্সগুলি কনফিগার করে।
Step 3: Use DeferredResult for Asynchronous Handling
Spring MVC তে DeferredResult ব্যবহার করলে, আপনি ওয়েব রিকোয়েস্টকে অ্যাসিঙ্ক্রোনাসভাবে হ্যান্ডল করতে পারেন এবং HTTP রেসপন্সটি যখন প্রক্রিয়া সম্পন্ন হবে, তখন রিটার্ন করা হবে।
DeferredResultController.java:
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("/asyncRequest")
public DeferredResult<String> handleAsyncRequest() {
DeferredResult<String> deferredResult = new DeferredResult<>();
// এখানে একটি দীর্ঘ-running কাজ সিমুলেট করা হচ্ছে
new Thread(() -> {
try {
Thread.sleep(5000); // 5 সেকেন্ডের জন্য থ্রেড স্লিপ
} catch (InterruptedException e) {
e.printStackTrace();
}
deferredResult.setResult("Async task completed!");
}).start();
return deferredResult;
}
}
ব্যাখ্যা:
DeferredResult<String>: এটি Spring MVC তে অ্যাসিঙ্ক্রোনাস রেসপন্সের জন্য ব্যবহৃত হয়। এই ক্লাসটি HTTP রেসপন্সটি পরবর্তী সময়ে অ্যাসিঙ্ক্রোনাসভাবে সেট করে দেয়।deferredResult.setResult(): এটি অ্যাসিঙ্ক্রোনাস কাজ সম্পন্ন হওয়ার পর HTTP রেসপন্স পাঠানোর জন্য ব্যবহৃত হয়।
Step 4: Enable Async Support in Spring Configuration
@EnableAsync অ্যানোটেশনটি আগে কনফিগার করা হয়েছে, তাই কোনো অতিরিক্ত কনফিগারেশন প্রয়োজন নেই যদি আপনি DeferredResult ব্যবহার করেন।
Spring MVC তে Asynchronous Request Handling এর সুবিধা:
- Non-blocking: অ্যাসিঙ্ক্রোনাস প্রসেসিং সার্ভারের থ্রেডগুলোকে ব্লক না করে, একাধিক রিকোয়েস্ট হ্যান্ডল করার সুযোগ প্রদান করে।
- Performance Improvement: বড় আকারের ডেটা প্রসেসিং, যেমন ইমেজ প্রক্রিয়াকরণ, ডেটাবেস কুয়েরি বা ফাইল আপলোড/ডাউনলোড ইত্যাদি করার সময় সার্ভার অন্যান্য রিকোয়েস্ট হ্যান্ডল করতে পারে।
- Scalability: একাধিক অ্যাসিঙ্ক্রোনাস কাজ একসাথে প্রক্রিয়া করা সম্ভব, যার ফলে অ্যাপ্লিকেশনটি আরও স্কেলেবল এবং আরও ইউজার এক্সপিরিয়েন্স প্রদান করতে সক্ষম হয়।
- Optimized Resource Usage: যেহেতু থ্রেডগুলি একে অপরকে ব্লক না করে, সার্ভারের রিসোর্স ব্যবহারের ক্ষমতা বৃদ্ধি পায়।
উপসংহার:
Spring MVC তে Asynchronous Request Handling ব্যবহার করে আপনি ওয়েব অ্যাপ্লিকেশনে অ্যাসিঙ্ক্রোনাস কার্যকলাপ পরিচালনা করতে পারেন, যা সার্ভারের কর্মক্ষমতা এবং স্কেলেবিলিটি বৃদ্ধি করতে সাহায্য করে। @Async এবং DeferredResult ব্যবহারের মাধ্যমে আপনি সহজেই অ্যাসিঙ্ক্রোনাস রিকোয়েস্ট হ্যান্ডলিং প্রক্রিয়া করতে পারেন। এতে ব্যবহারকারীরা অপেক্ষা না করে দ্রুত প্রতিক্রিয়া পেতে পারেন এবং সার্ভারও একাধিক রিকোয়েস্ট হ্যান্ডল করতে সক্ষম হয়।
@Async অ্যানোটেশন Spring Framework এর একটি সুবিধা যা অ্যাসিঙ্ক্রোনাস কার্যক্রম পরিচালনা করতে ব্যবহৃত হয়। এই অ্যানোটেশনটি একটি মেথডকে ব্যাকগ্রাউন্ড থ্রেডে রান করতে নির্দেশ দেয়, যা মূল থ্রেডকে ব্লক না করে কার্যক্রম সম্পাদন করতে সহায়তা করে। এটি বিশেষ করে দীর্ঘ চলমান কাজ যেমন ইমেইল পাঠানো, ডাটাবেস আপডেট, বা থার্ড পার্টি API কল এর জন্য ব্যবহৃত হয়।
Spring MVC তে @Async অ্যানোটেশন সাধারণত ইউজারের ইনপুট প্রক্রিয়া বা অন্যান্য দীর্ঘসময় চলতে থাকা কাজের জন্য ব্যবহার করা হয় যাতে সেগুলি ব্যাকগ্রাউন্ডে চলে এবং ইউজার দ্রুত রেসপন্স পায়।
@Async অ্যানোটেশন এর ব্যবহার:
ধাপ 1: Spring Configuration Enable করা
Spring-এ @Async অ্যানোটেশন ব্যবহার করার জন্য প্রথমে আপনার কনফিগারেশন ক্লাসে @EnableAsync অ্যানোটেশন যোগ করতে হবে। এটি Spring-কে অ্যাসিঙ্ক্রোনাস কার্যক্রম সক্রিয় করতে বলে।
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync // Enable asynchronous methods
public class AsyncConfig {
// Configuration for Async tasks (optional)
}
ধাপ 2: @Async অ্যানোটেশন ব্যবহার করা
@Async অ্যানোটেশন সেই মেথডে ব্যবহৃত হয় যেগুলি ব্যাকগ্রাউন্ডে রান করতে হবে। এই মেথডটি একটি Future, CompletableFuture, বা void রিটার্ন টাইপ হতে পারে। নিচে এর একটি উদাহরণ দেওয়া হলো:
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
public class MyService {
@Async
public CompletableFuture<String> performAsyncTask() throws InterruptedException {
// Simulating a long-running task (e.g., a 5-second delay)
Thread.sleep(5000);
return CompletableFuture.completedFuture("Task Completed");
}
@Async
public void performAsyncTaskWithoutReturn() throws InterruptedException {
// Simulating a long-running task (e.g., a 5-second delay)
Thread.sleep(5000);
System.out.println("Async Task without return value completed!");
}
}
@Async: এটি মেথডের উপর অ্যাসিঙ্ক্রোনাস কার্যক্রম চালানোর জন্য ব্যবহৃত হয়।CompletableFuture<String>: এটি ব্যাকগ্রাউন্ড কাজের শেষে রিটার্ন করা একটিFutureযা একটি ফলাফল প্রদান করবে।void: যদি কোন রিটার্ন ভ্যালু না থাকে, তবেvoidব্যবহার করা হয়।
ধাপ 3: Controller-এ @Async মেথড কল করা
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.CompletableFuture;
@RestController
public class AsyncController {
@Autowired
private MyService myService;
@GetMapping("/asyncTask")
public String executeAsyncTask() throws InterruptedException {
// Calling asynchronous method
CompletableFuture<String> result = myService.performAsyncTask();
// Simulating other tasks while the async task runs
System.out.println("Executing other tasks while async task is in progress...");
return "Async task is in progress!";
}
@GetMapping("/asyncTaskWithoutReturn")
public String executeAsyncTaskWithoutReturn() throws InterruptedException {
myService.performAsyncTaskWithoutReturn();
return "Async task without return is in progress!";
}
}
এখানে:
@AsyncমেথডperformAsyncTask()ব্যাকগ্রাউন্ড থ্রেডে চলে এবং দ্রুতreturnপ্রদান করে। আপনি মেথডের পরেCompletableFutureঅবজেক্টটির সাথে কাজ করতে পারেন, যা আসল কার্যক্রমের ফলাফল ধারণ করে।@AsyncমেথডperformAsyncTaskWithoutReturn()কোনও ফলাফল না দিয়ে শুধুমাত্র একটি কার্যক্রম সম্পন্ন করে।
ধাপ 4: Spring Configuration (Thread Pool Configuration)
স্প্রিং অ্যাসিঙ্ক্রোনাস কাজের জন্য ডিফল্ট থ্রেড পুল ব্যবহার করে, তবে আপনি চাইলে কাস্টম থ্রেড পুল কনফিগার করতে পারেন।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
public class AsyncConfig {
@Bean(name = "taskExecutor")
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(3); // Minimum number of threads
executor.setMaxPoolSize(10); // Maximum number of threads
executor.setQueueCapacity(25); // Queue size for tasks waiting to be executed
executor.setThreadNamePrefix("Async-"); // Thread name prefix
executor.initialize();
return executor;
}
}
এখানে:
CorePoolSize: থ্রেড পুলের প্রাথমিক সাইজ।MaxPoolSize: পুলে সর্বাধিক থ্রেড সংখ্যা।QueueCapacity: থ্রেড পুলের জন্য থ্রেডগুলো অ্যাসাইন করার জন্য অপেক্ষমাণ কাজের সংখ্যা।
Benefits of Using @Async in Spring MVC
- Non-blocking:
@Asyncব্যবহার করলে মূল থ্রেড ব্লক না হয়ে অ্যাসিঙ্ক্রোনাস কাজ করে। এর ফলে ইউজার ইন্টারফেস দ্রুত রেসপন্স করতে পারে। - Improved Performance: দীর্ঘ-running কাজ ব্যাকগ্রাউন্ডে করতে পারার মাধ্যমে অ্যাপ্লিকেশন আরও সাশ্রয়ী এবং দ্রুত কাজ করতে পারে।
- Concurrency: একাধিক কাজ একই সময়ে প্রক্রিয়াকরণের মাধ্যমে অ্যাপ্লিকেশন কর্মক্ষমতা বৃদ্ধি পায়। একাধিক ব্যাকগ্রাউন্ড টাস্ক চালানো সম্ভব হয়।
- Separation of Concerns: অ্যাসিঙ্ক্রোনাস কার্যক্রমগুলি কন্ট্রোলার বা মূল লজিক থেকে পৃথক করা যায়, যা কোডের পরিষ্কারতা এবং রক্ষণাবেক্ষণ সহজ করে।
Use Cases for @Async
- Sending Emails: ইমেল পাঠানোর কাজ ব্যাকগ্রাউন্ডে চালানোর জন্য
@Asyncব্যবহার করা যেতে পারে, যাতে ইউজার তাত্ক্ষণিকভাবে রেসপন্স পায়। - External API Calls: যদি আপনি তৃতীয় পক্ষের API কল করতে চান, যা সময়সাপেক্ষ হতে পারে, তখন তা ব্যাকগ্রাউন্ডে চালানোর জন্য
@Asyncব্যবহার করা যেতে পারে। - Heavy Computation: বড় বা দীর্ঘ সময় ধরে চলতে থাকা গণনা বা ডেটা প্রসেসিং কাজগুলো ব্যাকগ্রাউন্ডে পরিচালিত হতে পারে।
- Database Operations: বড় ডেটাবেস অপারেশনগুলি ব্যাকগ্রাউন্ডে চালানো যেতে পারে, যেমন বড় ডেটা ব্যাচ প্রক্রিয়াকরণ।
উপসংহার
Spring MVC তে @Async অ্যানোটেশন ব্যবহার করে আপনি অ্যাসিঙ্ক্রোনাস কার্যক্রম সহজেই পরিচালনা করতে পারেন, যা আপনার অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সহায়ক। এটি বিভিন্ন সময় সাপেক্ষ কাজ যেমন ইমেইল পাঠানো, ডেটাবেস অপারেশন, এবং অন্যান্য দীর্ঘ-running কাজের জন্য উপযুক্ত। @Async ব্যবহারের মাধ্যমে আপনার অ্যাপ্লিকেশন দ্রুত এবং ব্যবহারকারীদের জন্য আরও সাড়াদানকারী হতে পারে।
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 প্রক্রিয়া হ্যান্ডল করে।
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 processing ও response 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 বা সময়সাপেক্ষ কার্যক্রম থাকে।
Read more