Spring JMS消息侦听器无法找到JNDI查找

时间:2019-07-13 03:30:31

标签: spring websphere jndi

该应用程序使用Spring JMS Listener连接到JMS队列,并部署在WAS 8.5.x中。 使用Spring应用程序上下文xml,将org.springframework.jms.listener.DefaultMessageListenerContainer bean初始化为ConnectionFactory,目的地为JndiObjectFactoryBean。

在MessageListener类的onMessage()方法中,代码正尝试使用InitialContext查找JNDI引用,下面是代码段,

InitialContext ic = new InitialContext(); 字符串名称=(字符串)ic.lookup(“ jndiName”);

应用程序在处理消息时抛出以下异常。

Exception:javax.naming.ConfigurationException:  由于服务器运行时无法将操作的线程与任何J2​​EE应用程序组件相关联,因此无法完成对“ java:”名称的JNDI操作。当未在服务器应用程序请求的线程上执行使用“ java:”名称的JNDI客户端时,会发生这种情况。确保J2EE应用程序不在静态代码块内或该J2EE应用程序创建的线程中的“ java:”名称上执行JNDI操作。这样的代码不一定在服务器应用程序请求的线程上运行,因此JNDI操作对“ java:”名称不支持。 [根异常是javax.naming.NameNotFoundException:在上下文“ java:”中找不到名称comp / env / cache。]

我的理解是,消息侦听器线程是由应用程序在J2EE Web容器下的初始化期间创建的。该代码试图访问WebSphere服务器中定义的JNDI资源,但无法获取Initial Context的句柄。

注意:带有此JNDI条目的resource-ref标记包含在web.xml中。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我能够解决此问题。

这是解决方案, 在web.xml中,我定义了com.ibm.websphere.cache.DistributedMap类型的Resource引用。我在WebSphere管理控制台中创建了JNDI(类型为对象缓存),并在部署期间将其映射到该资源。

 <resource-ref id="sampleCacheName">
        <description>Resource reference to Cache</description>
        <res-ref-name>cache/sampleCache</res-ref-name>
        <res-type>com.ibm.websphere.cache.DistributedMap</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

在我的Spring上下文xml中,我定义了JMS侦听器bean,该bean从默认的WebSphere工作管理器中获取Task Executor对象

 <bean id="jmsContainerSampleEvent"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="myConnectionFactory" />
        <property name="destination" ref="myQueue" />
        <property name="messageListener" ref="myEventListener" />
        <property name ="concurrentConsumers" value ="5"/>
    <property name ="maxConcurrentConsumers" value ="20"/>
        <property name="taskExecutor" ref="workManagerTaskExecutor" />
</bean>


<bean id="workManagerTaskExecutor"
          class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor"
          p:workManagerName="wm/default" />