2009-08-24 8 views
5

JBoss 4.0.5, JBossMQ, और वसंत 2.0.8 का उपयोग करना, मैं वसंत कॉन्फ़िगर करने के लिए सेम जो एक दूरस्थ JMS कतार संसाधन पर निर्भर का दृष्टांत कोशिश कर रहा हूँ। रिमोट कनेक्शन फैक्ट्री ऑब्जेक्ट जैसी चीजों के लिए लुकअप करने के लिए जेएनडीआई का उपयोग करने के सभी उदाहरणों पर मैं निर्भर हूं।दूरस्थ मशीन चलने पर रिमोट जेएमएस कतार के लिए कनेक्शन फैक्टरी शुरू करने के लिए कैसे करें?

मेरे समस्या है जब, अगर रिमोट मशीन नहीं है, विफल तैनाती के कारण एक मशीन है जो दूरस्थ कतार में संदेश डाल ऊपर लाने के लिए कोशिश कर रहा JNDI देखने बस विफल रहता है, है। तैराकी के बाकी हिस्सों को अवरुद्ध नहीं करते समय इस वस्तु को पृष्ठभूमि में देखने की कोशिश करते हुए स्प्रिंग प्राप्त करने का कोई तरीका है?

उत्तर

3

आईआईटी के JNDI देखने करने के लिए वसंत के JndiObjectFactoryBean उपयोग कर रहे हैं, तो आप गलत पर lookupOnStartup संपत्ति है, जो संदर्भ की अनुमति देता है यहां तक ​​कि JNDI अगर शुरू करने के लिए सेट कर सकते हैं अपने वसंत config देखकर, लेकिन आप यह सोचते हैं बिना सुनिश्चित करने के लिए मुश्किल लक्ष्य वहां नहीं है। जेएनडीआई संकल्प पहली बार कनेक्शन फैक्ट्री का उपयोग किया जाएगा।

बहरहाल, यह सिर्फ समस्या आगे है क्योंकि कुछ अन्य घटक स्टार्टअप पर एक JMS Connection निकलने की कोशिश करता है, तो बदलाव श्रृंखला, है, तो आप वापस आ गए हैं जहाँ आप शुरू कर दिया। तैनाती पर होने से रोकने के लिए आप अपने अन्य बीन्स पर lazy-init="true" विशेषता का उपयोग कर सकते हैं, लेकिन गलती से अपनी कॉन्फ़िगरेशन में कुछ डालना आसान है जो सबकुछ आरंभ करने के लिए मजबूर करता है।

1

आप बिल्कुल सही कर रहे हैं। मैंने lookupOnStartup को झूठी और आलसी-init = true पर सेट करने का प्रयास किया। यह पहली बार समस्या को रोकता है जब कतार का उपयोग करने का प्रयास किया जाता है। तब एक अपवाद के रूप में निम्न प्रकार फेंक दिया जाता है:

[org.jboss.mq.il.uil2.SocketManager] Failed to handle: org.jboss.mq.il.uil2.msgs.CloseMsg29702787[msgType: m_connectionClosing, msgID: -2147483606, error: null] 
java.io.IOException: Client is not connected 

इसके अलावा, ऐसा लगता है कि देखने फिर से प्रयास कभी नहीं किया गया है। जब रिमोट कतार वाली मशीन को वापस लाया जाता है, तो बाद में कोई भी संदेश संसाधित नहीं होता है। यह वास्तव में है जैसे कि यह J2EE बकवास के लिए उपयोग के मामलों के लिफाफे के भीतर अच्छी तरह से किया जाना चाहिए प्रतीत होता है, और अभी तक मैं बहुत किस्मत होने नहीं कर रहा हूँ ... यह लगता है जैसे यह भी हो सकता है किया जाना चाहिए एक समस्या हल हो।

पूरा होने के लिए, निम्नलिखित मेरी स्प्रिंग विन्यास का उचित हिस्सा है।

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"> 
     <property name="environment"> 
      <props> 
      <prop key="java.naming.provider.url">localhost:1099</prop> 
      <prop key="java.naming.factory.url.pkgs">org.jnp.interfaces:org.jboss.naming</prop> 
      <prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiTemplate"> 
      <ref bean="jndiTemplate"/> 
     </property> 
     <property name="jndiName"> 
      <value>ConnectionFactory</value> 
     </property> 
    </bean> 

    <bean id="remoteJndiTemplate" class="org.springframework.jndi.JndiTemplate" lazy-init="true"> 
     <property name="environment"> 
      <props> 
      <prop key="java.naming.provider.url">jnp://10.0.100.232:1099</prop> 
      <prop key="java.naming.factory.url.pkgs">org.jnp.interfaces:org.jboss.naming</prop> 
      <prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="remoteConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="true"> 
     <property name="jndiTemplate" ref="remoteJndiTemplate"/> 
     <property name="jndiName" value="ConnectionFactory" /> 
     <property name="lookupOnStartup" value="false" /> 
     <property name="proxyInterface" value="javax.jms.ConnectionFactory" /> 
    </bean> 

    <bean id="destinationResolver" class="com.foo.jms.FooDestinationResolver" /> 

    <bean id="localVoicemailTranscodingDestination" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiTemplate" ref="jndiTemplate"/> 
     <property name="jndiName" value="queue/voicemailTranscoding" /> 
    </bean> 

    <bean id="globalVoicemailTranscodingDestination" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="true" > 
     <property name="jndiTemplate" ref="remoteJndiTemplate" /> 
     <property name="jndiName" value="queue/globalVoicemailTranscoding" /> 
    </bean> 

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate" > 
     <property name="connectionFactory" ref="connectionFactory"/> 
     <property name="defaultDestination" ref="localVoicemailTranscodingDestination" /> 
    </bean> 

    <bean id="remoteJmsTemplate" class="org.springframework.jms.core.JmsTemplate" lazy-init="true"> 
     <property name="connectionFactory" ref="remoteConnectionFactory"/> 
     <property name="destinationResolver" ref="destinationResolver"/> 
    </bean> 

    <bean id="globalQueueStatus" class="com.foo.bar.recording.GlobalQueueStatus" /> 

    <!-- Do not deploy this bean for machines other than transcoding machine --> 
    <condbean:cond test="${transcoding.server}"> 
     <bean id="voicemailMDPListener" 
       class="org.springframework.jms.listener.adapter.MessageListenerAdapter" lazy-init="true"> 
      <constructor-arg> 
       <bean class="com.foo.bar.recording.mdp.VoicemailMDP" lazy-init="true"> 
        <property name="manager" ref="vmMgr" /> 
       </bean> 
      </constructor-arg> 
     </bean> 
    </condbean:cond> 

    <bean id="voicemailForwardingMDPListener" 
      class="org.springframework.jms.listener.adapter.MessageListenerAdapter" lazy-init="true"> 
     <constructor-arg> 
      <bean class="com.foo.bar.recording.mdp.QueueForwardingMDP" lazy-init="true"> 
       <property name="queueStatus" ref="globalQueueStatus" /> 
       <property name="template" ref="remoteJmsTemplate" /> 
       <property name="remoteDestination" ref="globalVoicemailTranscodingDestination" /> 
      </bean> 
     </constructor-arg> 
    </bean> 

    <bean id="prototypeListenerContainer" 
      class="org.springframework.jms.listener.DefaultMessageListenerContainer" 
      abstract="true" 
      lazy-init="true"> 
     <property name="concurrentConsumers" value="5" /> 
     <property name="connectionFactory" ref="connectionFactory" /> 
     <!-- 2 is CLIENT_ACKNOWLEDGE: http://java.sun.com/j2ee/1.4/docs/api/constant-values.html#javax.jms.Session.CLIENT_ACKNOWLEDGE --> 
     <!-- 1 is autoacknowldge --> 
     <property name="sessionAcknowledgeMode" value="1" /> 
     <property name="sessionTransacted" value="true" /> 
    </bean> 

    <!-- Do not deploy this bean for machines other than transcoding machine --> 
    <condbean:cond test="${transcoding.server}"> 
     <bean id="voicemailMDPContainer" parent="prototypeListenerContainer" lazy-init="true"> 
      <property name="destination" ref="globalVoicemailTranscodingDestination" /> 
      <property name="messageListener" ref="voicemailMDPListener" /> 
     </bean> 
    </condbean:cond> 

    <bean id="voicemailForwardMDPContainer" parent="prototypeListenerContainer" lazy-init="true"> 
     <property name="destination" ref="localVoicemailTranscodingDestination" /> 
     <property name="messageListener" ref="voicemailForwardingMDPListener" /> 
    </bean> 
+0

सभी परिभाषाओं को आलसी-इनिट को हटाने का प्रयास करें, और प्रोटोटाइप लिस्टनरकंटनर परिभाषा के स्वत: स्टार्टअप को गलत पर सेट करें। यह श्रोता कंटेनर को संदर्भ स्टार्टअप पर कनेक्शन प्राप्त करने का प्रयास करने से रोक देगा, लेकिन फिर आपको श्रोता कंटेनर पर मैन्युअल रूप से कॉलिंग प्रारंभ करने का तरीका ढूंढना होगा। ओह, और जेएमएस की भयानकता में आपका स्वागत है। – skaffman

+0

अगर मैं सिर्फ पृष्ठभूमि में होने के लिए जेएनडीआई लुकअप प्राप्त कर सकता हूं और बस अपने ग्राहकों को बिना किसी सर्वर के अपने सुखद तरीके से जाने देता हूं, तो सब कुछ चंचल होगा। मैं आपके सुझाव का प्रयास करूंगा। धन्यवाद। – Erik

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