2016-07-14 6 views
11

मैंने स्प्रिंग बूट एप्लिकेशन में @Service कक्षा को एक तरीके से अतुल्यकालिक रूप से चलाने के तरीकों के साथ किया था। जैसा कि मैंने पढ़ा है विधि @Async एनोटेटेड होनी चाहिए और मुझे TaskExecutor बीन चलाने की ज़रूरत है। लेकिन स्प्रिंग मैनुअल http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html में मुझे कोई जानकारी या उदाहरण नहीं मिला है, उदाहरण के बिना TaskExecutor एनोटेशन के साथ, एक्सएमएल कॉन्फ़िगरेशन के बिना कैसे चलाएं। एक्सएमएल के बिना स्प्रिंग बूट में TaskExecutor बीन बनाना संभव है, केवल एनोटेशन के साथ? यहाँ मेरी सेवा वर्ग:वसंत बूट। एनोटेशन के साथ टास्क एक्स्सेलर कैसे बनाएं?

@Service 
public class CatalogPageServiceImpl implements CatalogPageService { 

    @Override 
    public void processPagesList(List<CatalogPage> catalogPageList) { 
     for (CatalogPage catalogPage:catalogPageList){ 
      processPage(catalogPage); 
     } 
    } 

    @Override 
    @Async("locationPageExecutor") 
    public void processPage(CatalogPage catalogPage) { 
     System.out.println("print from Async method "+catalogPage.getUrl()); 
    } 
} 

उत्तर

20

अपने स्प्रिंग बूट आवेदन वर्ग के लिए एक @Bean विधि जोड़ें:

@SpringBootApplication 
@EnableAsync 
public class MySpringBootApp { 

    @Bean 
    public TaskExecutor taskExecutor() { 
     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
     executor.setCorePoolSize(5); 
     executor.setMaxPoolSize(10); 
     executor.setQueueCapacity(25); 
     return executor; 
    } 

    public static void main(String[] args) { 
     // ... 
    } 
} 

Java-based container configuration देखें कैसे जावा config बजाय XML का उपयोग स्प्रिंग कॉन्फ़िगर करने के स्प्रिंग फ्रेमवर्क संदर्भ दस्तावेज में।

(नोट: आपको कक्षा में @Configuration जोड़ने की आवश्यकता नहीं है क्योंकि @SpringBootApplication में पहले से ही @Configuration शामिल हैं)।

+0

मैं बनाने के रूप में आप का उल्लेख है और यह एक सेम (बनाता है मैं यह कर सकते हैं "@Autowire" यह मेरे परीक्षण वर्ग जूस में यह जानने के लिए टी), लेकिन मेरी सेवा विधि असीमित रूप से नहीं चलती है। यहां मेरी विधि का वर्णन: "@ बीन सार्वजनिक कार्य एक्सप्लोरर स्थानपेजएक्सएटर()"। क्या आप टिप्पणी कर सकते हैं? – Pavlo

+0

किसी भी तरह से लगता है कि आपने मेरे प्रारंभिक प्रश्न का उत्तर दिया है, इसलिए मैं नई समस्या को हल करने का तरीका देखूंगा। धन्यवाद। – Pavlo

+0

@Pavlo आपको अपने स्प्रिंग बूट ऐप क्लास में '@ EnableAsync' भी जोड़ना होगा, देखें: [शेड्यूलिंग एनोटेशन सक्षम करें] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html /scheduling.html#scheduling-enable-annotation-support) – Jesper

2

पहले - चलो नियमों पर चलते हैं - @Async दो सीमाएँ हैं: - एक ही कक्षा के भीतर से async विधि बुला - जीता

  • यह जनता के तरीकों केवल
  • आत्म मंगलाचरण के लिए लागू किया जाना चाहिए 'टी काम

तो अपने processPage() विधि अलग वर्ग में होना चाहिए

+0

@Async को सार्वजनिक होने की आवश्यकता नहीं है (कम से कम अब आवश्यकता नहीं है) –