मैं अपने भविष्य के @Async
एनोटेशन के साथ चिह्नित एक विधि को रद्द करने में सक्षम होना चाहता हूं।वसंत रद्द करें @ एसिंक कार्य
मेरे पास @Async
एनोटेशन के साथ चिह्नित एक स्प्रिंग विधि है। यह विधि कुछ गणना करता है, और अंततः परिणाम देता है। मैंने देखा है कि सभी उदाहरण इस भविष्य को वापस करने के लिए AsyncResult
कक्षा का उपयोग करने की सलाह देते हैं।
@Async
public Future<String> run() {
// ... Computation. Minutes pass ...
return new AsyncResult<String>("Result");
}
मैं निम्नलिखित तरीके से, किसी अन्य घटक से निम्न विधि को कॉल करता हूं। उदाहरण के प्रयोजनों के लिए, मैं तुरंत इस धागे को रद्द करना चाहता हूं:
Future<String> future = component.run();
future.cancel(true);
इस मामले में, धागा कभी रद्द नहीं किया जाएगा। ऐसा इसलिए है क्योंकि, AsyncResult
के लिए वसंत कार्यान्वयन को यहां देखें: https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/java/org/springframework/scheduling/annotation/AsyncResult.java#L71, यह विधि वास्तव में एक ही चीज़ नहीं करती है। यह बस झूठा लौटाता है, कि धागा रद्द नहीं किया जा सका। यह मेरी समस्या है। मैं @Async
विधि द्वारा बनाए गए थ्रेड को कैसे रद्द कर सकता हूं? मुझे वसंत द्वारा बनाए गए आंतरिक धागे तक कोई पहुंच नहीं है - इसलिए मेरे पास इसका कोई मतलब नहीं है जिसके साथ इसे रद्द करना है, क्या मैं?
उन 2 उत्तरों की जांच करें [यहां] (http://stackoverflow.com/questions/21084195/spring-async-cancel-and-start) और [यहां] (http://stackoverflow.com/questions/35798987/ स्टॉप-ए-एसिंक-स्प्रिंग-विधि-कॉलर-क्लास), या फिर '@ Async' एनोटेटेड विधियों को संभालने के लिए कस्टम' थ्रेडपूल एक्स्प्लोरर 'बनाएं या कस्टम' AsyncResult' को पास करें जो चल रहे कार्य से बाध्य होगा। – AntJavaDev
उन प्रश्नों के उत्तर बाद के बिंदु पर प्रसंस्करण रोकने के लिए चलने वाले थ्रेड को बताने के लिए कुछ ध्वज/सेमफोर बनाने का वर्णन करने लगते हैं। यह थ्रेड को समाप्त करने से अलग है क्योंकि Future.cancel() विधि स्वयं परिभाषित 'रननेबल' में करेगी। क्या आप थोड़ा आगे बता सकते हैं कि कस्टम 'थ्रेडपूल एक्स्सेलर' कैसा दिखता है? मैं अपने स्वयं के निष्पादक को भी परिभाषित करता हूं, इसलिए इसमें जोड़ना कठिन या असुविधाजनक नहीं होगा। –