2009-08-24 22 views
5

JBoss 4.0.5, JBossMQ ve Spring 2.0.8'i kullanarak, uzak bir JMS Kuyruğu kaynağına bağlı olan çekirdekleri oluşturmak için İlkbahar'ı yapılandırmaya çalışıyorum. Karşılaştığım tüm örnekler, uzak ConnectionFactory nesnesi gibi şeyleri aramak için JNDI kullanmaya dayanıyor.Uzak makine çalışmadığında uzak JMS kuyruğu için ConnectionFactory nasıl başlatılır?

Sorunum, uzak sıraya bağlı değilse, uzak sıraya ileti koyacak bir makine getirmeye çalışırken, JNDI araması başarısız oluyor ve dağıtımın başarısız olmasına neden oluyor. Bahar'ın geri kalanını engellemeden bu nesneyi arka planda aramaya çalışmaya devam etmesinin bir yolu var mı?

cevap

3

IIT o sırada bile Jndi eğer başlatmak için bağlam verir false lookupOnStartup özelliğini ayarlayabilirsiniz, Jndi arama yapmak Bahar en JndiObjectFactoryBean kullandığınız bahar yapılandırma gördükten ama teşekkür varsayarak olmadan emin olmak zordur hedef orada değil. JNDI çözünürlüğü, ConnectionFactory ilk kez kullanıldığında yapılacaktır. diğer bazı bileşen başlangıçta JMS Connection almaya çalışırsa çünkü

Ancak bu sadece başladığı yere, sonra döndünüz, zincirin daha da yukarı sorunu kaydırır. Bu işlemin gerçekleşmesini önlemek için diğer çekirdeklerinizdeki lazy-init="true" özniteliğini kullanabilirsiniz, ancak yanlışlıkla yapılandırmanız için her şeyi başlatmaya zorlayan bir şey koymak kolaydır.

1

Kesinlikle haklısınız. Yanlış ve tembel-init = true için lookupOnStartup ayarlamayı denedim. Bu, yalnızca Sorunun kullanılmaya çalışıldığı ilk defa sorunu çözer. Sonra aşağıdaki gibi bir istisnası atılır: arama tekrar teşebbüs asla gibi

[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 

Üstelik görünüyor. Uzak sıranın bulunduğu makine yedeklendiğinde, daha sonra hiç ileti işlenmez. Bu gerçekten J2EE saçmalık için kullanım durumları zarf içinde olması gerektiği gibi görünüyor ve henüz çok şansım yok ... Bu belki de çözülmüş sorunu olması gerektiği gibi hissediyor.

Tamamlama aşkına gelince, Bahar yapılandırmamın ilgili kısmı aşağıdadır.

<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

Tüm tanımları yavaşça kaldırmayı deneyin ve prototypeListenerContainer tanımının autoStartup değerini false olarak ayarlayın. Bu, dinleyici konteynerinin içerik başlangıcı üzerinde bir bağlantı kurmaya çalışmasını durduracaktır, ancak daha sonra dinleyici kapsayıcısında start() yöntemini kendiniz çağırmanın bir yolunu bulmanız gerekir. Oh, ve JMS'nin berbatlığına hoş geldiniz. – skaffman

+0

Eğer JNDI arayışını arka planda devam etmeme izin verebilir ve sadece müşterilerim sunucu olmadan neşeli yollarına devam edebilir, her şey şeftali olur. Önerinizi deneyeceğim. Teşekkür ederim. – Erik