Frage

Ich habe Setup eine Feder Config für JMS. Dinge gut funktionieren, es sei denn ich kann nicht scheinen, um es zu faul Last (Mitteilung unter dem Standard-lazy-init wahr im Code) zu erhalten. Wenn ich unter den jmsContainer (DMLC) von meiner Config auf Kommentar, verzögertes Laden funktioniert wie erwartet. Andernfalls wird es die DMLC instanziiert, was wiederum die Warteschlange und Verbindungs-Factory erstellt.

Was bin ich?

jmsContext.xml:

<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
       default-lazy-init="true">

    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
                <prop key="java.naming.provider.url">t3:localhost:7001</prop>
            </props>
        </property>
    </bean>

    <bean id="queue" class="org.springframework.jndi.JndiObjectFactoryBean"
          p:jndiTemplate-ref="jndiTemplate" p:jndiName="jms/queue"/>

    <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"
          p:jndiTemplate-ref="jndiTemplate" p:jndiName="jms/connectionfactory"/>

    <bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver"
        p:jndiTemplate-ref="jndiTemplate" p:cache="true" />

    <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"
          p:autoStartup="false"
          p:destination-ref="queue"
          p:destinationResolver-ref="jmsDestinationResolver"
          p:connectionFactory-ref="connectionFactory"
          p:messageListener-ref="queueListener" />

    <bean id="queueListener" class="com.blah.QueueListener"/>


</beans>

Und der Test verwende ich es zu fahren, DummyTest.java:

package blah;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:jmsContext.xml")
public class DummyTest {

    @Test
    public void shouldDoSomething() {

    }

}

Wenn jmsContainer Kommentar gesetzt ist, den Test über Pässe. Ansonsten habe ich diese:

java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'jmsContainer' defined in class path resource [com/blah/config/jmsContext.xml]: 
Cannot resolve reference to bean 'connectionFactory' while setting bean property 'connectionFactory'; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'connectionFactory' defined in class path resource [com/blah/config/jmsContext.xml]: 
Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: 
Exception in lookup.: `jms/connectionfactory' could not be found. 
[Root exception is weblogic.corba.cos.naming.NamingContextAnyPackage.NotFound: IDL:weblogic/corba/cos/naming/NamingContextAny/NotFound:1.0]

Die „connection“ Bohne wird als eine Abhängigkeit von „jmsContainer“ instanziiert und es funktioniert nicht. Mit "jmsContainer", kommentierte out "connection" instanziiert erhalten nicht.

Der jms Code funktioniert gut, aber ich habe meine JNDI Namen absichtlich umbenannt, so kann ich sehen, wenn die Dinge beginnen.

War es hilfreich?

Lösung

OK, das ist ziemlich dunkel, aber DefaultMessageListenerContainer implementiert die Lifecycle Schnittstelle und Bohnen, die diese implementieren, werden in den eigenen Lebenszyklus Kontext gebunden - wenn der Kontext startet, Lifecycle-Implementierung Bohnen initialisiert und gestartet. Dies bedeutet, dass Ihre lazy-init config im Wesentlichen ignoriert.

Andere Tipps

Die Lösung ist autoStartup auf false zu verwenden. Sehen Sie den Code unten.

<bean id="listenerContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
     ........
    <property name="autoStartup" value="false"/>
</bean>

~ Shyam

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top