2012-06-25 18 views
6

हमारा आवेदन स्प्रिंग एकीकरण फ्रेमवर्क का उपयोग करके डिज़ाइन किया गया है। क्यूई के सुनने के साथ पूर्ण संदेश कार्रवाई प्रवाह शुरू होता है जिसके लिए जेएमएस संदेश संचालित एडाप्टर का उपयोग किया जाता है जिसके बाद चैनल आधारित i.e. queue endpoints परिभाषित किया गया है और प्रत्येक एंडपॉइंट को सेवा-सक्रियकर्ताओं द्वारा संसाधित किया जाता है।वसंत एकीकरण

हम वर्तमान में प्रदर्शन चरण में हैं, हम 200 संदेश अनुरोध तैयार कर रहे हैं। प्रारंभ में हमने पाया कि संदेशों को समानांतर में निष्पादित नहीं किया जा रहा था, कुछ पढ़ने के बाद यह पता चला कि जेएमएस संदेश संचालित श्रोता एडाप्टर को समवर्ती उपभोक्ता और अधिकतम समवर्ती उपभोक्ता संपत्ति जोड़कर बहु-थ्रेडिंग मोड को सक्षम करने में मदद मिलेगी। असल में यह मदद करता है लेकिन अभी भी प्रक्रिया के बीच कहीं भी मैं एकल थ्रेड प्रभाव देखता हूं। क्या इस तरह से एंडपॉइंट को परिभाषित किया गया है? प्रत्येक एंडपॉइंट पर कतार क्षमता जोड़ने का क्या फायदा है? क्या आपको लगता है कि प्रत्येक चैनल एंडपॉइंट परिभाषा के लिए कतार-क्षमता जोड़कर फिर से mutli-threading मोड में चलाने में मदद मिलेगी।

डिजाइन स्नैपशॉट के रूप में अनुरोध किया:

action flow

+0

हम अपने कोड के कुछ देख सकते हैं में कृपया – Satya

उत्तर

0

यह अपने चैनलों की सटीक परिभाषा को देखने के लिए उपयोगी होगा।

डिफ़ॉल्ट रूप से, एक स्प्रिंग चैनल प्रेषक के धागे में अपना संदेश खपत करता है। दूसरे शब्दों में, यह तुल्यकालिक है। यदि आप चैनल को असीमित रूप से संदेशों का उपभोग करना चाहते हैं, तो आपको एक कार्यक्षेत्र निर्दिष्ट करना होगा। http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/scheduling.html

0

अपने प्रवाह आरेख को देखते हुए, ऐसा लगता है कि प्रवाह में बहुत से थ्रेडेड तत्व हैं और उम्मीद है कि वे उच्च थ्रूपुट के साथ अधिक समवर्ती हो सकते हैं।

संदेश संचालित चैनल एडाप्टर के साथ शुरू करने के लिए (आप उस के लिए विन्यास नहीं दिखाया), विन्यस्त किया जा सकता 1 से अधिक डिफ़ॉल्ट उपभोक्ता के लिए, और करने के लिए संदेश की एक उचित संख्या की खपत प्रति उपभोग किया जा सकता है चक्र

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

डायरेक्ट चैनल 1 से परे (क्यूई चैनल 1 में बदल गया), मुझे लगता है कि आपका प्रवाह कितना तेज़ या धीमा है, यदि मेल एडाप्टर धीमा है तो डायरेक्ट चैनल 4 को कतार बनाया जा सकता है चैनल भी, डायरेक्ट चैनल 5

के साथ एक ही आप कृपया अगर इन परिवर्तनों को बढ़ाने के प्रदर्शन मैं उपयोग की में एक कार्य प्रबंधक के साथ एक executorchannel कर सकते हैं सुझाव के लिए प्रवाह बेहतर

0

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

कतार संदेश चैनल के लिए वास्तव में आपको एक ऐसे परामर्शदाता की आवश्यकता है जो चैनल पर मतदान करने के लिए मतदान करे, कतार क्षमता दृश्यों के पीछे परमाणु कतार की क्षमता है।

आप एक्सएमएल में इस तरह से बजे निष्पादक चैनल कॉन्फ़िगर कर सकते हैं

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:si="http://www.springframework.org/schema/integration" 
     xmlns:tx="http://www.springframework.org/schema/task" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/integration 
     http://www.springframework.org/schema/integration/spring-integration.xsd 
     http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> 

     <tx:executor id="taskExecutor" pool-size="10" queue-capacity="10"/> 
     <si:channel id="ch" > 
       <si:dispatcher task-executor="taskExecutor"/>  
     </si:channel> 
</beans> 

या जावा-डीएसएल में इस तरह

@Bean 
    public IntegrationFlow storeBookPageByPage(ConnectionFactory connectionFactory, 
               @Qualifier("createBookQueue") Destination createBookQueue, 
               @Qualifier("createBookResultQueue") Destination createBookResultQueue, 
               PdfBookMasterRepository pdfBookMasterRepository, 
               BookRepository bookRepository){ 
     String tempFilePathBaseDir = environment.getProperty("bookService.storeBookPageByPage.tempFilePathBaseDir"); 

     return IntegrationFlows.from(Jms.messageDriverChannelAdapter(connectionFactory) 
       .destination(createBookQueue) 
       .errorChannel(storeBookPageByPageErrorChannel())) 
       .channel(channels -> channels.executor(Executors.newScheduledThreadPool(5))) 
       ..... 

     }