在我的应用程序中运行集成测试时,我在我的集成测试之一的"失败法"测试报告中获取以下错误消息:
listener.DefaultMessageListenerContainer,WARN,Setup of JMS message listener invoker failed for destination 'jms/myapp.OneWorker' - trying to recover. Cause: Destination [jms/myapp.OneWorker] not found in JNDI; nested exception is javax.naming.NameNotFoundException: jms/myapp.OneWorker
以下是我的配置详细信息:
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
org.apache.activemq.jndi.ActiveMQInitialContextFactory</prop>
<prop key="java.naming.provider.url">vm://localhost:0</prop>
<prop key="java.naming.security.principal">system</prop>
<prop key="java.naming.security.credentials">system</prop>
</props>
</property>
</bean>
<bean id="jndiQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="jndiName" value="jmsFactory" />
</bean>
<bean id="queueConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="jndiQueueConnectionFactory" />
<property name="sessionCacheSize" value="1" />
</bean>
<bean id="destinationResolver"
class="org.springframework.jms.support.destination.JndiDestinationResolver">
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="cache" value="true" />
<property name="fallbackToDynamicDestination" value="false" />
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="queueConnectionFactory" />
<property name="destinationResolver" ref="destinationResolver" />
<property name="pubSubDomain" value="true" />
</bean>
<bean id="workerOneListener" class="com.org.myapp.workflow.WorkerOne">
<property name="workflowManager" ref="workflowManagerImpl" />
</bean>
<jms:listener-container connection-factory="queueConnectionFactory"
destination-resolver="destinationResolver" concurrency="3">
<jms:listener destination="jms/myapp.OneWorker" ref="workerOneListener" />
<jms:listener destination="jms/myapp.TwoWorker" ref="workerOneListener" />
<jms:listener destination="jms/myapp.ThreeWorker" ref="workerOneListener" />
</jms:listener-container>
集成测试具有创建Spring应用程序上下文的基类,并由模块中的所有其他集成测试共享。
我启用了使用调试级别的记录,并在以下错误消息中获取:
2014-01-29 11:13:24,connection.CachingConnectionFactory,DEBUG,Closing cached Session: ActiveMQSession {id=ID:CHN03876623-56121-1390973978321-2:0:70,started=true}
2014-01-29 11:13:24,connection.CachingConnectionFactory,DEBUG,Closing cached Session: ActiveMQSession {id=ID:CHN03876623-56121-1390973978321-2:0:70,started=true}
2014-01-29 11:13:24,connection.CachingConnectionFactory,DEBUG,Creating cached JMS Session for mode 1: ActiveMQSession {id=ID:CHN03876623-56121-1390973978321-2:0:71,started=true}
2014-01-29 11:13:24,jndi.JndiTemplate,DEBUG,Looking up JNDI object with name [jms/myapp.OneWorker]
2014-01-29 11:13:24,destination.JndiDestinationResolver,DEBUG,Destination [jms/myapp.OneWorker] not found in JNDI
javax.naming.NameNotFoundException: jms/myapp.OneWorker
at org.apache.activemq.jndi.ReadOnlyContext.lookup(ReadOnlyContext.java:225)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:154)
at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:179)
at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
at org.springframework.jms.support.destination.JndiDestinationResolver.resolveDestinationName(JndiDestinationResolver.java:111)
at org.springframework.jms.support.destination.JmsDestinationAccessor.resolveDestinationName(JmsDestinationAccessor.java:100)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.createListenerConsumer(AbstractPollingMessageListenerContainer.java:221)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.initResourcesIfNecessary(DefaultMessageListenerContainer.java:1081)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947)
at java.lang.Thread.run(Thread.java:662)
此日志消息将一次又一次地无限地重复,对于其他两个工人也是如此。此时,构建悬挂在这一点上。我使用unitils
框架进行集成测试,并在我的基础集成测试类中使用@SpringApplicationContext
创建春季上下文。我要去哪里?
当我想使用相同的客户端ID(ConnectionFactory.setClientID)访问相同的耐用订阅(即主题)时,这发生在我身上。将唯一的客户端ID分配给客户解决问题。
不确定这是问题所在,但是我解决了这种方法:
使用@SpringApplicationContext
正在加载多个Spring XML文件,最后加载的Spring XML文件之一排除了其他上下文XML所需的几类,并且上下文被重新加载了这些类别。
我还看到@SpringApplicationContext
我删除了冗余,并在其中重新排序或删除了不需要的弹簧XML或几个豆子。它起作用了。
您正在尝试查找JMS侦听器,该侦听器在JNDI名称空间中不存在。您确定您正在运行JNDI容器,并且您的MQ服务器正在运行并正确设置?
我遇到了类似的问题,就我而言,我遇到了这个错误,直到没有出版商为止。一旦出版商,该消息就开始就该主题发布,JMS侦听器就会积极聆听,并且错误消息消失了。如果主题中没有任何内容,也没有发布者,我就可以再次复制此问题。JMS开始投掷此错误,这很奇怪。