@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 ব্যবহারের মাধ্যমে আপনার অ্যাপ্লিকেশন দ্রুত এবং ব্যবহারকারীদের জন্য আরও সাড়াদানকারী হতে পারে।
Read more