2016-08-10 12 views
5

मैं अपने भविष्य के @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 विधि द्वारा बनाए गए थ्रेड को कैसे रद्द कर सकता हूं? मुझे वसंत द्वारा बनाए गए आंतरिक धागे तक कोई पहुंच नहीं है - इसलिए मेरे पास इसका कोई मतलब नहीं है जिसके साथ इसे रद्द करना है, क्या मैं?

+0

उन 2 उत्तरों की जांच करें [यहां] (http://stackoverflow.com/questions/21084195/spring-async-cancel-and-start) और [यहां] (http://stackoverflow.com/questions/35798987/ स्टॉप-ए-एसिंक-स्प्रिंग-विधि-कॉलर-क्लास), या फिर '@ Async' एनोटेटेड विधियों को संभालने के लिए कस्टम' थ्रेडपूल एक्स्प्लोरर 'बनाएं या कस्टम' AsyncResult' को पास करें जो चल रहे कार्य से बाध्य होगा। – AntJavaDev

+0

उन प्रश्नों के उत्तर बाद के बिंदु पर प्रसंस्करण रोकने के लिए चलने वाले थ्रेड को बताने के लिए कुछ ध्वज/सेमफोर बनाने का वर्णन करने लगते हैं। यह थ्रेड को समाप्त करने से अलग है क्योंकि Future.cancel() विधि स्वयं परिभाषित 'रननेबल' में करेगी। क्या आप थोड़ा आगे बता सकते हैं कि कस्टम 'थ्रेडपूल एक्स्सेलर' कैसा दिखता है? मैं अपने स्वयं के निष्पादक को भी परिभाषित करता हूं, इसलिए इसमें जोड़ना कठिन या असुविधाजनक नहीं होगा। –

उत्तर

4

असल में, वसंत @Async अपने स्वयं के पृष्ठभूमि थ्रेड पूल का उपयोग करता है। और जब तक निष्पादक सेवा के भविष्य या शटडाउन Now() की रद्द() विधि का संबंध है, executor.shutdownNow() or future.cancel(true) पर कॉल करना तुरंत चल रहे थ्रेड को रोकें। इन तरीकों का क्या संबंध है संबंधित संबंधों पर बस .interrupt() पर कॉल करें। और interrupts में कोई गारंटी नहीं तत्काल प्रभाव है। यह झंडा जारी करता है इसलिए जब भी सोने या प्रतीक्षा राज्य में, धागा बंद कर दिया जाएगा।

ध्यान दें, यदि आपके कार्य बाधाओं को अनदेखा करते हैं, तो executor.shutdownNow() and future.cancel(true)executor.shutdown() and future.cancel(false) जैसा ही व्यवहार करेगा।

यदि आपको धीमी या अवरुद्ध संचालन को रोकने के लिए एक तरीका चाहिए। यदि आपके पास एक लंबा/अंतहीन पाश है, तो आप केवल Thread.currentThread().isInterrupted() पर एक शर्त जोड़ सकते हैं और यदि यह सत्य है (ऑपरेशन समाप्त करें) जारी रखें।

+0

ग्रेट। मैंने अपने '@ Async' विधि के तर्क में' Thread.interrupted() 'के लिए बूलियन चेक जोड़ा; और यदि मैं बाधा का पता लगाता हूं, तो मैं विधि को सुरक्षित रूप से फाड़ सकता हूं और निष्पादन रद्द कर सकता हूं। –

संबंधित मुद्दे