0

我正在运行创建DefaultMessageListenerContainerbean 的 Tomcat。为此,它指的是connectionFactory使用 bean 的 bean,该jndiTemplatebean 使用imq/imq_admin_objects.

bean定义如下

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="connectionFactory" ref="connectionFactory"/>
  <property name="destination" ref="destination"/>
  <property name="messageListener" ref="transactionMessageListener"/>
  <property name="sessionTransacted" value="true"/>
  <property name="concurrentConsumers" value="1"/>
</bean>

<!-- JMS configuration -->
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
  <property name="environment">
    <props>
      <prop key="java.naming.factory.initial">
        com.sun.jndi.fscontext.RefFSContextFactory
      </prop>
      <prop key="java.naming.provider.url">
        file:///var/imq/imq_admin_objects
      </prop>
    </props>
  </property>
</bean>

<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiTemplate" ref="jndiTemplate"/>
  <property name="jndiName" value="factory"/>
</bean>

问题是没有生成这样的文件夹。我正在为 JMS 使用 Message Queue Broker 4.5。在运行服务时,它只创建一个 var/mq 目录。我希望它生成一个 imq 文件夹,该文件夹将包含用于创建 JMS 的相应绑定文件。

4

1 回答 1

1

我相信你在这里的期望是不正确的。引用的文件系统对象存储com.sun.jndi.fscontext.RefFSContextFactory必须已经存在。它不会为您创建它。您必须创建并提供它,这样 bean 才能正确初始化并且 JNDI 查找可以正常工作。

绑定文件包含诸如 JNDI 查找名称以及如何通过网络连接到服务器的详细信息(例如主机名、端口等)。这些详细信息必须由管理员提供。JNDI 实现不能自己想出它们。

如果您浏览从Open MQ 4.5 文档页面链接的“Java 客户端开发人员指南”并查看标题为“使用 Java API”的第 2 章,您将在“获取连接工厂”部分看到这一点:

通常,连接工厂由 Message Queue 管理员创建并进行预配置,使用Oracle GlassFish Server Message Queue 管理指南中的“管理任务和工具”中描述的管理工具以及适合连接到特定 JMS 提供程序的任何属性设置。然后将工厂放置在一个公开可用的受管理对象存储中,您可以在其中使用 Java 命名和目录接口 (JNDI) API 按名称访问它。

在文档的后面,您将找到一个如何在 JNDI 对象存储中查找连接工厂对象的示例。此示例与您一样使用文件系统对象存储,它特别指出:

C:/imq_admin_objects 代表的目录必须已经存在;如有必要,您必须在代码中引用它之前创建该目录。

简而言之,您必须创建受管理的文件系统对象存储并使其公开可用,以便 JNDI 客户端可以使用它。

于 2019-09-16T18:16:36.853 回答