@Async के साथ अतुल्यकालिक विधियाँ
Spring के `@Async` एनोटेशन और थ्रेड पूल का उपयोग करके विधियों को अतुल्यकालिक रूप से चलाना सीखें।
@Async के साथ अतुल्यकालिक विधियाँ, CoddyKit पर Spring Boot 4 की संपूर्ण मार्गदर्शिका का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Spring Boot 4 की संपूर्ण मार्गदर्शिका सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
असिंक्रोनस कार्यों का परिचय
कल्पना कीजिए कि आप ऑनलाइन खाना मँगवा रहे हैं। यदि ऐप आपको अन्य विकल्प देखने से पहले रसोइए के खाना पकाने तक प्रतीक्षा करवाए, तो यह बहुत खराब अनुभव होगा!
यह सिंक्रोनस कार्यों जैसा है: अगला कार्य शुरू होने से पहले एक कार्य का पूरा होना आवश्यक है। इससे मुख्य प्रवाह रुक जाता है।
दूसरी ओर, असिंक्रोनस कार्य आपको कोई कार्य शुरू करके तुरंत किसी अन्य कार्य पर जाने देते हैं। पहला कार्य पृष्ठभूमि में चलता रहता है और पूरा होने पर आपको सूचित किया जाता है।
- गैर-अवरोधक: आपका अनुप्रयोग प्रतिक्रियाशील बना रहता है।
- कुशल: कई कार्यों को समवर्ती रूप से करके संसाधनों का बेहतर उपयोग होता है।
सिंक्रोनस बनाम असिंक्रोनस प्रदर्शन
आइए अवरोधक (सिंक्रोनस) कार्य का एक सरल Java उदाहरण देखें। ध्यान दें कि मुख्य थ्रेड doSyncTask() के पूरा होने की प्रतीक्षा करता है।
इस उदाहरण को चलाकर देखें:
public class Main {
public static void main(String[] args) {
System.out.println("Main thread: Starting sync task...");
long startTime = System.currentTimeMillis();
doSyncTask(); // This call blocks the main thread
long endTime = System.currentTimeMillis();
System.out.println("Main thread: Sync task finished in " + (endTime - startTime) + "ms.");
System.out.println("Main thread: Continues immediately after sync task.");
}
public static void doSyncTask() {
try {
System.out.println("Sync task: Simulating work for 2 seconds...");
Thread.sleep(2000); // Simulate a long operation
System.out.println("Sync task: Completed!");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println("Sync task: Interrupted!");
}
}
}Spring के @Async से परिचय
Spring Boot में @Async एनोटेशन का उपयोग करके सिंक्रोनस विधि को असिंक्रोनस विधि में बदलना बेहद आसान है।
जब आप किसी विधि पर @Async लगाते हैं:
- Spring उस विधि को अलग थ्रेड में चलाता है।
- कॉल करने वाली विधि तुरंत लौट आती है और
@Asyncविधि के पूरा होने की प्रतीक्षा नहीं करती। - आपको थ्रेड को स्वयं प्रबंधित करने की आवश्यकता नहीं होती!
@Async सक्रिय करें
@Async का उपयोग करने से पहले, आपको अपने Spring Boot अनुप्रयोग में असिंक्रोनस प्रसंस्करण सक्षम करना होगा। इसके लिए @EnableAsync एनोटेशन जोड़ें।
आमतौर पर @EnableAsync को मुख्य अनुप्रयोग class या किसी समर्पित कॉन्फ़िगरेशन class पर लगाया जाता है।
इसे जोड़ने का तरीका:
package com.coddykit.async;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync // This annotation activates @Async capability
public class AsyncApplication {
public static void main(String[] args) {
SpringApplication.run(AsyncApplication.class, args);
System.out.println("Spring Boot application started with @EnableAsync!");
}
}@Async विधि की मूल बातें
एक बार @EnableAsync जोड़ने के बाद, आप Spring द्वारा प्रबंधित किसी घटक (जैसे @Service या @Component) की किसी भी public विधि में @Async जोड़ सकते हैं।
जब performAsyncTask() को कॉल किया जाता है, तो असिंक्रोनस कार्य पृष्ठभूमि में चलता रहेगा और मुख्य थ्रेड तुरंत अपनी अगली पंक्ति प्रिंट कर देगा।
package com.coddykit.async;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync
public class AsyncApplication {
public static void main(String[] args) {
SpringApplication.run(AsyncApplication.class, args);
}
@Bean
public CommandLineRunner run(MyAsyncTaskService service) {
return args -> {
System.out.println("Main thread: Calling async task...");
service.performAsyncTask(); // This call returns immediately
System.out.println("Main thread: Async task called, continuing immediately.");
// Give the async task a chance to finish before the app exits
Thread.sleep(3000);
};
}
}
@Service
class MyAsyncTaskService {
@Async // Mark this method to run asynchronously
public void performAsyncTask() {
try {
System.out.println("Async thread: Starting long task...");
Thread.sleep(2000); // Simulate a long operation
System.out.println("Async thread: Long task completed!");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println("Async thread: Task interrupted.");
}
}
}@Async कैसे काम करता है
जब आप @Async का उपयोग करते हैं, तो Spring प्रत्येक कॉल के लिए नया थ्रेड नहीं बनाता। इसके बजाय, यह थ्रेड पूल का उपयोग करता है।
- थ्रेड पूल पहले से आरंभ किए गए थ्रेड का समूह होता है, जो कार्यों को चला सकता है।
- जब किसी
@Asyncविधि को कॉल किया जाता है, तो Spring उसे चलाने के लिए पूल से उपलब्ध थ्रेड लेता है। - इससे लगातार नए थ्रेड बनाने का अतिरिक्त खर्च बचता है और सिस्टम संसाधनों का कुशल प्रबंधन होता है।
- डिफ़ॉल्ट रूप से Spring
SimpleAsyncTaskExecutorका उपयोग करता है, जो भारी भार के लिए अक्षम हो सकता है।
Future से परिणाम प्राप्त करें
यदि आपकी असिंक्रोनस विधि को कॉल करने वाले को परिणाम लौटाना हो तो क्या होगा? आप सीधे void या कोई मान नहीं लौटा सकते।
इसके लिए आप java.util.concurrent.Future का उपयोग करते हैं। Future ऑब्जेक्ट ऐसे परिणाम के लिए स्थानधारक की तरह काम करता है जो अभी उपलब्ध नहीं है।
@AsyncविधिFuture<T>लौटाती है (जैसेFuture<String>)।- कॉल करने वाला कोड बाद में परिणाम प्राप्त करने के लिए
future.get()कॉल कर सकता है (परिणाम तैयार होने तक यह कॉल रुकती है)। - आप बिना रुके यह देखने के लिए
future.isDone()भी जाँच सकते हैं कि कार्य पूरा हुआ है या नहीं।
package com.coddykit.async;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync;
import java.util.concurrent.Future;
import java.util.concurrent.AsyncResult;
@SpringBootApplication
@EnableAsync
public class AsyncApplication {
public static void main(String[] args) {
SpringApplication.run(AsyncApplication.class, args);
}
@Bean
public CommandLineRunner run(MyFutureTaskService service) {
return args -> {
System.out.println("Main thread: Calling async task with Future...");
Future<String> futureResult = service.performFutureTask();
System.out.println("Main thread: Async task called, continuing immediately.");
// Main thread can do other work while async task runs
System.out.println("Main thread: Doing other work...");
Thread.sleep(500);
// Wait for the result (this loop checks, future.get() blocks)
while(!futureResult.isDone()) {
System.out.println("Main thread: Waiting for async result...");
Thread.sleep(500);
}
String result = futureResult.get(); // Retrieves the result (blocks if not done)
System.out.println("Main thread: Received result: " + result);
};
}
}
@Service
class MyFutureTaskService {
@Async
public Future<String> performFutureTask() {
try {
System.out.println("Async thread: Starting Future task...");
Thread.sleep(2000); // Simulate a long operation
System.out.println("Async thread: Future task completed!");
return new AsyncResult<>("Task finished successfully!");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return new AsyncResult<>("Task interrupted!");
}
}
}असिंक्रोनस त्रुटि प्रबंधन
जब कोई @Async विधि, विशेषकर void विधि, कोई अपवाद उत्पन्न करती है, तो डिफ़ॉल्ट रूप से वह कॉल करने वाले थ्रेड तक नहीं पहुँचता। इसका अर्थ है कि अपवाद चुपचाप अनदेखा हो सकता है, जिससे त्रुटि-निवारण कठिन हो जाता है।
@Async विधियों में अपवादों को सही ढंग से संभालने के लिए आप AsyncConfigurer लागू कर सकते हैं और एक कस्टम AsyncUncaughtExceptionHandler प्रदान कर सकते हैं।
- यह हैंडलर
@Asyncविधियों द्वारा उत्पन्न किसी भी अपवाद को पकड़ता है। - यह आपको त्रुटियों का लॉग बनाने, सूचनाएँ भेजने या त्रुटि से उबरने की अन्य कार्रवाइयाँ करने देता है।
Futureलौटाने वाली विधियों में अपवादFutureमें लपेट दिया जाता है औरfuture.get()कॉल किए जाने पर उत्पन्न होता है।
कस्टम थ्रेड पूल
उत्पादन अनुप्रयोगों के लिए @Async हेतु अपना थ्रेड पूल (Executor) कॉन्फ़िगर करना अत्यंत महत्वपूर्ण है। इससे आपको संसाधनों और प्रदर्शन पर नियंत्रण मिलता है।
आप एक ThreadPoolTaskExecutor bean निर्धारित करके उसके गुण निर्दिष्ट करते हैं:
corePoolSize: सक्रिय रखे जाने वाले थ्रेड की न्यूनतम संख्या।maxPoolSize: पूल में मौजूद हो सकने वाले थ्रेड की अधिकतम संख्या।queueCapacity: चलाए जाने की प्रतीक्षा कर रहे कार्यों की कतार की क्षमता।threadNamePrefix: इस पूल के थ्रेड नामों के लिए उपसर्ग, जो लॉगिंग के लिए उपयोगी है।
इसके बाद आप @Async("executorBeanName") के साथ यह निर्दिष्ट कर सकते हैं कि कौन-सा Executor उपयोग करना है।
package com.coddykit.async;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name = "customAsyncExecutor")
public Executor customAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2); // Keep 2 threads always running
executor.setMaxPoolSize(5); // Allow up to 5 threads if demand is high
executor.setQueueCapacity(10); // Queue up to 10 tasks if all threads are busy
executor.setThreadNamePrefix("CustomAsync-"); // Helps identify threads in logs
executor.initialize();
return executor;
}
// To use this, you'd annotate your async method like this:
// @Async("customAsyncExecutor")
// public void myCustomAsyncMethod() { /* ... */ }
}असिंक्रोनस त्वरित जाँच
आइए Spring के @Async एनोटेशन के बारे में आपकी समझ जाँचें।
पाठ का सारांश
बहुत अच्छा! आपने Spring Boot के @Async के साथ असिंक्रोनस प्रसंस्करण की मूल बातें सीख ली हैं।
- हमने देखा कि सिंक्रोनस कार्यों से अवरोध उत्पन्न होता है, जबकि असिंक्रोनस कार्य गैर-अवरोधक निष्पादन की अनुमति देते हैं।
@EnableAsyncएनोटेशन असिंक्रोनस विधि प्रसंस्करण सक्रिय करता है।- किसी विधि पर लगाया गया
@Asyncएनोटेशन सुनिश्चित करता है कि वह अलग थ्रेड में चले। - असिंक्रोनस विधियों से परिणाम लौटाने के लिए हम
Future<T>का उपयोग करते हैं। - कस्टम
ThreadPoolTaskExecutorbean थ्रेड पूल के व्यवहार पर सूक्ष्म नियंत्रण देते हैं।
अब हम संदेश कतारों पर ध्यान देंगे, जो सेवाओं को अलग-अलग रखने और बड़े स्तर पर असिंक्रोनस संचार संभालने का शक्तिशाली तरीका हैं।
एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 21
- पाठ
- 84
अक्सर पूछे जाने वाले प्रश्न
क्या “@Async के साथ अतुल्यकालिक विधियाँ” पाठ निःशुल्क है?
हाँ — Spring Boot 4 की संपूर्ण मार्गदर्शिका अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “@Async के साथ अतुल्यकालिक विधियाँ” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“@Async के साथ अतुल्यकालिक विधियाँ” में मैं क्या सीखूँगा?
Spring के `@Async` एनोटेशन और थ्रेड पूल का उपयोग करके विधियों को अतुल्यकालिक रूप से चलाना सीखें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Spring Boot 4 की संपूर्ण मार्गदर्शिका का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Spring Boot 4 की संपूर्ण मार्गदर्शिका शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Spring Boot 4 की संपूर्ण मार्गदर्शिका शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“@Async के साथ अतुल्यकालिक विधियाँ” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- @Async के साथ अतुल्यकालिक विधियाँ
- संदेश कतारों का परिचय
- RabbitMQ/Kafka का एकीकरण
- @Scheduled से कार्यों का समय-निर्धारण