2017-06-22 15 views
7

मैं DBbuildServletDispatcher लोड करने के लिए, परिष्करण प्रसंग लोड हो रहा है, ApplicationListener<ContextRefreshedEvent> घटना आग संदेश पर जैसे निर्माण करने के लिए के बाद (या आगे बढ़ना इमारत) AppServletDispatcherप्रसंग चाहते हैंस्प्रिंग: सुनिश्चित ServeltDispatcher प्रसंग एक और प्रसंग खत्म लोड हो रहा है जब तक इंतजार

SpringMultiDisp

अन्य शब्दों में AppDispatcher ContextDBbuild Context के निर्माण को समाप्त होने तक प्रतीक्षा कर सकता है? क्या ऐसा करने के कोई सामान्य तरीके हैं?

+0

आप डीबी संदर्भ से एक बच्चे के रूप ऐप संदर्भ चिह्नित कर सकते हैं। मुझे यकीन नहीं है कि यह सही काम है, लेकिन ऐप संदर्भ निश्चित रूप से डीबी के लिए इंतजार करेगा। –

+0

आपको अपने वेब.एक्सएमएल में ऐपडिस्पैचर संदर्भ के लिए 1 और 2 जोड़ने की आवश्यकता है। इस लक्ष्य को हासिल करें। –

उत्तर

6

यह आसान है। याद रखें कि परम दायरा दो प्रकारों का है - संदर्भ सर्वो और सर्वलेट के init param। आपको जो चाहिए वह है कि बच्चे के संदर्भ लोड होने से पहले सभी निर्भरताओं को आरंभ किया जाना चाहिए। यहाँ DBbuildServletDispatcher माता पिता संदर्भ में initialised किया जाना चाहिए, कि ApplicationContext है, और AppServletDispatcherWebApplicationContext जो आवेदन संदर्भ से बच्चे संदर्भ है

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring/DBbuildServletDispatcher.xml 
    </param-value> 
</context-param> 



<servlet> 
    <servlet-name>firstServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/AppServletDispatcher.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>my-servlet</servlet-name> 
    <url-pattern>/abc/* </url-pattern> 
</servlet-mapping> 

संदर्भ परम साथ पहले भाग प्रसंग फ़ाइल लोड करता है और बनाने है एप्लिकेशनकॉन्टेक्स्ट। दूसरा भाग WebAplicationContext को परिभाषित करता है। here और WebApplicationContextUtils का भी उपयोग किया जा सकता है।

2

ऐसा कुछ काम कर सकता है। आप इस लाइन को जोड़ने के बाद ही DBbuildContext.xml (applicationContext.xml) लोड

: फिर

<bean id="eventListenerBean" class="a.b.c.ApplicationListenerBean" /> 

,

package a.b.c; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationEvent; 
import org.springframework.context.ApplicationListener; 
import org.springframework.context.event.ContextRefreshedEvent; 

public class ApplicationListenerBean implements ApplicationListener { 

    @Override 
    public void onApplicationEvent(ApplicationEvent event) { 
     if (event instanceof ContextRefreshedEvent) { 
      ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("appServletContext.xml"); 

     } 
    } 
} 

एक वर्ग को परिभाषित अब appServletContext.xml केवल एक संदर्भ पैदा करेगा जब dbBuildContext.xml लोड हो गया है।

1

बस किसी भी सामान्य WebServlet की तरह, डिस्पैचर सर्वलेट की इन्स्टेन्शियशन web.xml में आदेश दिया जा सकता <load-on-startup>

का उपयोग कर servlet 2.5 web.xml xsd

लोड-ऑन-स्टार्टअप तत्व को देखते हुए पता चलता है कि इस सर्वलेट चाहिए वेब एप्लिकेशन के स्टार्टअप पर लोड (तत्काल और इसकी init() कहा जाता है) हो। इन तत्वों की वैकल्पिक सामग्री पूर्णांक होना चाहिए जो उस क्रम को इंगित करता है जिसमें सर्वलेट लोड किया जाना चाहिए। यदि मान एक नकारात्मक पूर्णांक है, या तत्व मौजूद नहीं है, तो कंटेनर जब भी इसे चुनता है तो सर्वलेट लोड करने के लिए स्वतंत्र होता है। यदि मान एक सकारात्मक पूर्णांक या 0 है, तो कंटेनर लोड होना चाहिए और सर्विसलेट को तैनात करने के रूप में सर्वलेट प्रारंभ करना होगा। कंटेनर को यह सुनिश्चित करना होगा कि निचले पूर्णांक वाले चिह्नित सर्वलेट को उच्च पूर्णांक वाले चिह्नित सर्वलेट से पहले लोड किया गया हो। कंटेनर उसी लोड-ऑन-स्टार्ट-अप मान वाले सर्वलेट्स को लोड करने का क्रम चुन सकता है।

तो inorder के लिए DBbuildServletDispatcher पहले लोड करने के लिए, सुनिश्चित करें कि अपनी load-on-startup की तुलना में कम है load-on-startupAppServletDispatcher की

<servlet> 
    <servlet-name>DBbuildServletDispatcher</servlet-name> 
    <servlet-class>com.foo.DBbuildServletDispatcher</servlet-class> 
    <load-on-startup>0</load-on-startup> 
</servlet> 
<servlet> 
    <servlet-name>AppServletDispatcher</servlet-name> 
    <servlet-class>com.foo.AppServletDispatcher</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
संबंधित मुद्दे