当前位置: 首页 > 知识库问答 >
问题:

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

宓昂雄
2023-03-14

该应用程序使用Spring JMS Listener连接到JMS队列,并在WAS 8.5中部署。x、 使用spring应用程序上下文xml,org。springframework。jms。听众。DefaultMessageListenerContainerbean用ConnectionFactory初始化,目标为JNDObjectFactoryBean

MessageListenerclassonMessage()方法中,代码试图使用初始上下文查找JNDI引用,代码片段如下,

InitialContext ic = new InitialContext();
String name = (String) ic.lookup("jndiName");

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

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

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

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

<resource-ref id="configCache">
  <description>Resource reference to Configuration Cache</description>
  <res-ref-name>cache/config</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>

任何帮助都将不胜感激。

共有1个答案

穆飞星
2023-03-14

我解决了这个问题。

以下是解决方案,在网络上。xml我定义了com类型的资源引用。国际商用机器公司websphere。隐藏物分发地图。我在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,它从默认的WebSphere work manager获取任务执行器对象,

 <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" />
 类似资料:
  • 我正在使用 发送和 对于现在从rappid mq接收消息,我希望使用类似以下内容的侦听器: 问题是onMessage监听器与Messages一起工作是否有可能在类似的函数中接收简单的可序列化对象?

  • 我是Apache Kafka的新手,能够从发送方发送消息(以JSON格式),但不能在消费者服务中消费。 有人能帮我吗?

  • 我有一个Spring应用程序在独立的JBoss EAP 6.2中运行(带有嵌入式HornetQ提供程序)。 消息被成功地放在队列中(我可以在jboss eap-6.2\独立\data\MessagingJournal\hornetq-data-1.hq中看到它们,因为队列是持久的),但不会被侦听器拾取(侦听器中的断点不会被命中)。我怀疑配置中缺少或错误的东西,但看不出是什么。JBoss启动时没有任

  • null:javax.naming.nameNotFoundException:project1-ear-1.0.0.00/project1-services-ejb1.0.0.0/personServiceImpl!com.domain.project1.interfaces.personService--service jboss.naming.context.java.“project1-e

  • 问题内容: 我正在尝试使用selenium在kahoot.it网页上自动生成大量用户,以使它们出现在类的前面,但是,当我尝试访问inputSession项时(在其中写入gameID进入游戏) 这是错误: 任何帮助将非常感激!:) 问题答案: 可能是竞标条件,在该竞标条件下find元素在页面上出现之前就已执行。看一下等待超时文档。这是文档中的示例