@Async অ্যানোটেশন কী?
স্প্রিং ফ্রেমওয়ার্কে @Async অ্যানোটেশনটি ব্যবহার করা হয় কোনো মেথড বা টাস্ককে অ্যাসিঙ্ক্রোনাসলি (asynchronously) চালানোর জন্য। এটি থ্রেড ব্লক না করে ব্যাকগ্রাউন্ডে একটি আলাদা থ্রেড ব্যবহার করে কাজ সম্পন্ন করে।
অ্যাসিঙ্ক্রোনাস প্রসেসিংয়ের মূল লক্ষ্য হলো অ্যাপ্লিকেশনের কার্যকারিতা বৃদ্ধি করা এবং মেইন থ্রেডকে ব্লক না করে দ্রুত প্রতিক্রিয়া প্রদান করা।
@Async এর কাজ করার পদ্ধতি
- মেথড আলাদাভাবে চালানো:
@Asyncদিয়ে চিহ্নিত মেথডটি ডিফল্ট থ্রেড থেকে আলাদা একটি থ্রেড পুলে রান করে। - অ্যাসিঙ্ক্রোনাস প্রসেসিং: অ্যাপ্লিকেশনটি মেথড চালানোর সময় ব্লক না হয়ে কাজ চালিয়ে যেতে পারে।
- রিটার্ন টাইপ:
- যদি মেথড কিছু রিটার্ন না করে, তখন এটি
voidহতে পারে। - যদি মেথড কিছু রিটার্ন করে, তখন এটি
FutureবাCompletableFutureহতে পারে।
- যদি মেথড কিছু রিটার্ন না করে, তখন এটি
@Async ব্যবহার করার ধাপ
1. স্প্রিং কনফিগারেশন এ @EnableAsync যোগ করা
@Async কাজ করার জন্য ক্লাস বা কনফিগারেশন ফাইলে @EnableAsync যোগ করতে হবে।
@Configuration
@EnableAsync
public class AppConfig {
// Additional configurations if needed
}
2. @Async দিয়ে মেথড ডিফাইন করা
একটি মেথডকে অ্যাসিঙ্ক্রোনাস হিসেবে ডিফাইন করতে @Async ব্যবহার করতে হবে।
@Service
public class MyService {
@Async
public void asyncMethod() {
System.out.println("Executing async method: " + Thread.currentThread().getName());
try {
Thread.sleep(2000); // Simulate delay
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Async method execution complete.");
}
@Async
public CompletableFuture<String> asyncMethodWithReturn() {
System.out.println("Executing async method with return: " + Thread.currentThread().getName());
try {
Thread.sleep(2000); // Simulate delay
} catch (InterruptedException e) {
e.printStackTrace();
}
return CompletableFuture.completedFuture("Task Completed!");
}
}
3. মেথড কল করা
@Async দিয়ে চিহ্নিত মেথড কল করার সময় এটি আলাদা থ্রেডে চালু হয়।
@RestController
public class MyController {
private final MyService myService;
public MyController(MyService myService) {
this.myService = myService;
}
@GetMapping("/executeAsync")
public String executeAsyncTask() {
myService.asyncMethod();
return "Async Task Executed!";
}
@GetMapping("/executeAsyncWithReturn")
public CompletableFuture<String> executeAsyncTaskWithReturn() {
return myService.asyncMethodWithReturn();
}
}
বিকল্প থ্রেড পুল কনফিগার করা
ডিফল্ট থ্রেড পুলের পরিবর্তে কাস্টম থ্রেড পুল ব্যবহার করতে হলে কনফিগারেশন যোগ করতে হবে।
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
executor.setThreadNamePrefix("AsyncThread-");
executor.initialize();
return executor;
}
}
@Async ব্যবহার করার সুবিধা
- পারফরম্যান্স বৃদ্ধি: ব্যাকগ্রাউন্ড থ্রেড ব্যবহার করে দ্রুত কাজ সম্পন্ন করা।
- ইউজার এক্সপেরিয়েন্স উন্নত করা: দীর্ঘমেয়াদী টাস্ক আলাদা থ্রেডে প্রসেস করে মেইন অ্যাপ্লিকেশনকে দ্রুত প্রতিক্রিয়া দেওয়ার সুযোগ।
- রিসোর্সের কার্যকর ব্যবহার: মেইন থ্রেড ব্লক না করে অ্যাপ্লিকেশন মসৃণভাবে চালানো যায়।
মনে রাখার বিষয়সমূহ
@Asyncকাজ করার জন্য স্প্রিং কনটেইনারের (Spring Context) মাধ্যমে ক্লাসটি ম্যানেজ হতে হবে। অর্থাৎ, এটি একটি@Service,@Component, বা@Beanহতে হবে।@Async-এর কাজ সঠিকভাবে সম্পন্ন করতে হলে থ্রেড পুল ঠিকভাবে কনফিগার করা জরুরি।- অ্যাসিঙ্ক্রোনাস মেথডগুলোর রিটার্ন টাইপ
void,Future, বাCompletableFutureহতে হবে।
উপসংহার
স্প্রিং-এর @Async অ্যানোটেশন দীর্ঘমেয়াদী প্রসেসিংয়ের জন্য একটি কার্যকর এবং সহজ উপায়। এটি অ্যাপ্লিকেশনের কার্যক্ষমতা বৃদ্ধি করে এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সহায়ক।
Read more