该应用程序使用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: 由于服务器运行时无法将操作的线程与任何J2EE应用程序组件相关联,因此无法完成对“ 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中。
任何帮助将不胜感激。
答案 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" />