2010-11-24 10 views
11

चला रहा है हम अपने जेएमएस उपभोक्ता में थ्रेडपूलएक्सएटर का उपयोग कर रहे हैं और इसे डिफॉल्ट मैसेज लिस्टरनर कंटेनर में इंजेक्शन दे रहे हैं। मुझे उम्मीद है कि यह कई संदेशों के लिए समवर्ती धागे चल रहा है, हालांकि हमारे लॉग दिखाते हैं कि थ्रेड आईडी नहीं बदलेगी। हमारा लॉगिंग दिखाता है कि संदेशों की विभिन्न प्रसंस्करण के लिए, थ्रेड आईडी हमेशा 24 पर होती है।स्प्रिंग थ्रेडपूलटास्क एक्स्सेलर केवल एक थ्रेड

यह है उस स्थिति में वसंत विन्यास:

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer"  
     p:connectionFactory-ref="cachedConnectionFactory" 
     p:destination-ref="formsCRRDestination" 
     p:messageListener-ref="formServicePojo" 
     p:concurrentConsumers="5" 
     p:idleTaskExecutionLimit="1" 
     p:maxConcurrentConsumers="25" 
     p:taskExecutor-ref="threadPoolExecutor"   
     destroy-method="doShutdown"  
    > 


<bean id="threadPoolExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" > 
     <property name="corePoolSize" value="1"/> 
     <property name="maxPoolSize" value="15"/> 
     <property name="keepAliveSeconds" value="30"/> 
    </bean> 

DefaultMessageListenerContainer में threadPoolExectuor सेम इंजेक्शन नहीं करने के बाद, संदेश अब अलग धागे में मार डाला जा रहा है।

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer"  
      p:connectionFactory-ref="cachedConnectionFactory" 
      p:destination-ref="formsCRRDestination" 
      p:messageListener-ref="formServicePojo" 
      p:concurrentConsumers="5" 
      p:idleTaskExecutionLimit="1" 
      p:maxConcurrentConsumers="25"  
      destroy-method="doShutdown"  
     > 

मैं प्रलेखन पढ़ने की कोशिश की है और मुझे समझ नहीं आता क्यों यह हो रहा है:

इस जिसके परिणामस्वरूप विन्यास है। कोई स्पष्टीकरण?

+0

मैं जेएम में नहीं हूं, लेकिन क्या आपने एक ही समय में कई संदेश भेजने का प्रयास किया? मुझे लगता है कि यहां तंत्र केवल मांग पर एक नया धागा शुरू करना है (यानी कोई निष्क्रिय धागा नहीं है और एक नया संदेश आता है)। –

+0

हां मैंने एक ही समय में कई संदेश भेजने का प्रयास किया था केवल कुछ संदेशों को संसाधित करने में काफी समय लगता है। – Jeune

उत्तर

14

ThreadPoolTaskExecutor के लिए ThreadPoolTaskExecutor code in Spring के माध्यम से जा रहा है और जावा डॉक्स पढ़ने के बाद मुझे लगता है कि यह जवाब है:

असीम कतारों। एक असंबद्ध कतार का उपयोग करना (उदाहरण के लिए पूर्वनिर्धारित क्षमता के बिना LinkedBlockingQueue) नए कार्यों को उन मामलों में कतारबद्ध करने का कारण बनेंगे जहां सभी कोरपूल आकार थ्रेड व्यस्त हैं। इस प्रकार, कोरपूलसाइज थ्रेड से अधिक नहीं कभी भी बनाया जाएगा।

हमारे विन्यास में ऊपर (और maximumPoolSize का मूल्य इसलिए कोई असर नहीं होता है।), हम डिफ़ॉल्ट रूप से LinkedBlockingQueue उपयोग कर रहे थे और हमारे corePoolSize 1. है यही कारण है कि maximumPoolSize नहीं होगा कोई प्रभाव है।

+1

समस्या को ठीक करने के तरीके के बारे में जानकारी जोड़ने के लिए अपने उत्तर को संपादित करने पर विचार करें। जावा कोड या वसंत विन्यास क्या बदला जाना चाहिए? धन्यवाद। – Gray

2

कोरपूलसाइज को 10 में बदलें, तो आपको 10 धागे एक साथ चलेंगे। java.util.concurrent.ThreadPoolExecutor जो वसंत ThreadPoolTaskExecutor की रीढ़ की हड्डी है पर javadoc पढ़ें, तो आप बेहतर समझते हैं corePoolSize और maxPoolSize और queueCapacity

7

मुझे लगता है कि चुने हुए जवाब गलत है विन्यास के लिए कैसे होगा। IIRC, जिस तरह से ThreadPoolTaskExecutor (अंततः JDK में ThreadPoolExecutor) काम कर

  1. ThreadPoolTaskExecutor अप corePoolSize के धागे बनाने जब यह शुरू की है।
  2. यह कोरपूलसाइज पर अनुरोध करता है और कार्य को संसाधित करने के लिए थ्रेड देता है।
  3. यदि सभी धागे व्यस्त होने पर आने वाले अधिक अनुरोध हैं, तो ThreadPoolTaskExecutor उन अनुरोधों को आंतरिक कतार में कतारबद्ध करना शुरू कर रहा है। यह समस्याग्रस्त हो सकता है क्योंकि यह कतार आकार डिफ़ॉल्ट रूप से Integer.MAX_VALUE होगा यदि आप कतार कतार क्षमता निर्दिष्ट नहीं करते हैं।
  4. पूल में कोई भी उपलब्ध थ्रेड होने पर # 3 में जोड़ा गया अनुरोध थ्रेड द्वारा निष्पादित किया जाएगा।
  5. यदि अनुरोध जारी रहे हैं और सभी धागे व्यस्त हैं & कतार पूर्ण है, तो ThreadPoolTaskExecutor अनुरोधों को संसाधित करने के लिए maxPoolSize तक नए धागे बनाने शुरू कर देता है।
  6. यदि उन पर अनुरोध (बढ़े धागे संख्या + कतार आकार), तो कार्य को अस्वीकार कर दिया जाएगा या आपके द्वारा निर्दिष्ट नीति का पालन किया जाएगा।

तो समस्या यहाँ मुझे लगता है कि है, या तो 1) अपने उपभोक्ता काफी तेजी से है या 2) यदि आप अनुरोध स्टैकिंग रहे हैं इतनी धीमी गति से, तो एक धागा आप corePoolSize साथ निर्दिष्ट बिना नए आने वाले अनुरोधों + पंक्तिबद्ध कार्य पर कार्रवाई करने के लिए पर्याप्त था ThreadPoolTaskExecutor को नए धागे बनाने की इजाजत देता है। मुझे पूरा यकीन है कि अगर आप इसे कड़ी मेहनत करते हैं या छोटी संख्या (जैसे 5 ~ 10) के साथ कतार की क्षमता निर्धारित करते हैं, तो आप देख पाएंगे कि धागे की संख्या बढ़ रही है।

28

इस प्रयास करें:

<bean id="threadPoolTaskExecutor" 
     class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
     <property name="corePoolSize" value="10" /> 
     <property name="maxPoolSize" value="25" /> 
     <property name="queueCapacity" value="30" /> 
</bean> 
  • यह प्रारंभ के समय में 10 धागे का निर्माण करेगा।
  • यदि सभी 10 धागे व्यस्त हैं और नया कार्य आता है, तो यह कार्य कतार में रखेगा।
  • यदि कतार पूर्ण है तो यह 11 वें धागा बनाएगा और 25 तक जाएगा।
  • फिर टास्क रेजेक्टेड अपवाद फेंक देगा।
+1

इस उत्तर के साथ समस्या यह है कि यह नहीं हो रहा है _why_ यह हो रहा है। यही कारण है कि दूसरा जवाब मेरे लिए चेक-मार्क प्राप्त करता है। फिर फिर यह स्वीकार करने के लिए स्वीकार्य उत्तर के लिए अच्छा होगा कि इसे कैसे ठीक किया जाए। – Gray

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