Pregunta

Me he configuración de una configuración de resorte para JMS. bien funcionan las cosas, excepto que parece que no puede conseguir que la carga perezosa (aviso al default-lazy-init cierto en el código de abajo). Si comento hacia fuera del jmsContainer (DCLM) de mi config continuación, trabajos de carga lenta como se esperaba. De lo contrario, será una instancia de la DCLM, que a su vez crea la fábrica de colas y la conexión.

¿Qué me falta?

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>

Y la prueba de que estoy usando para conducirlo, 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() {

    }

}

Cuando jmsContainer está comentado, la prueba anterior pases. De lo contrario, me sale esto:

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]

El frijol "ConnectionFactory" se crea una instancia como una dependencia del "jmsContainer" y se produce un error. Con "jmsContainer" comentada, "ConnectionFactory" no consigue instancia.

El código JMS funciona bien, pero he cambiado el nombre de mis nombres JNDI a propósito para que pueda ver cuando las cosas empezar.

¿Fue útil?

Solución

OK, esto es bastante oscuro, pero implementos DefaultMessageListenerContainer la interfaz Lifecycle y frijoles que implementan este se atan en el propio ciclo de vida del contexto - cuando el contexto se pone en marcha, frijoles Lifecycle-implementación se inicializa y se inicia. Esto significa que su configuración perezoso-init es esencialmente ignorados.

Otros consejos

La solución es utilizar autoStartup a falso. Ver el código de abajo.

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

~ Shyam

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top