将ActiveMQ添加为JMS提供程序,主题连接工厂和主题定义

问题描述

我正在尝试将ActiveMQ添加为Websphere Application Server中的JMS提供程序。

我已经按照ActiveMQ 5.11 with WebSphere Application Server 8.5中所述的说明进行了操作,并适应了该主题

不幸的是,我不确定对于主题连接工厂和主题定义都需要在外部JNDI名称添加什么。

根据IBM文档:

“外部JNDI名称用于将队列绑定到的JNDI名称 应用程序服务器名称空间。

按照惯例,使用完全限定的JNDI名称;例如,在 格式为jms / Name,其中Name是资源的逻辑名称

名称用于链接平台绑定信息。的 绑定将部署描述符定义的资源关联起来 模块与绑定到JNDI的实际(物理)资源的关系 平台。”

据我了解,这应该是我在应用程序中用来访问WAS中定义的资源的名称

我还已经在部署描述符中将资源添加为资源。

任何帮助将不胜感激。

致谢

解决方法

鉴于您正在通过资源引用(在部署描述符中定义)访问资源,则配置的JNDI名称应与资源引用中定义的查找名称匹配。

例如,如果您的资源引用如下所示,

  <resource-ref>
    <res-ref-name>java:comp/env/jms/topicConnectionFactoryRef</res-ref-name>
    <res-type>javax.jms.TopicConnectionFactory</res-type>
    <lookup-name>jms/myTopicConnectionFactory</lookup-name>
  </resource-ref>

或者如果您的资源引用缺少lookup-name,而是拥有一个带有绑定名称的ibm-web-bnd.xml文件,

  <resource-ref name="java:comp/env/jms/topicConnectionFactoryRef"
                binding-name="jms/myTopicConnectionFactory">
  </resource-ref>

然后将jms / myTopicConnectionFactory指定为JNDI名称。 然后,应用程序代码即可:

TopicConnectionFactory tcf = InitialContext.doLookup("java:comp/env/jms/topicConnectionFactoryRef");

应用程序代码还可以按以下方式直接查找JNDI名称(尽管最好使用资源引用,因为它更符合规范且在应用服务器之间是标准的),

TopicConnectionFactory tcf = InitialContext.doLookup("jms/myTopicConnectionFactory");

javax.jms.Topic也是如此。 如果部署描述符中的资源环境引用看起来像这样,

  <resource-env-ref>
    <resource-env-ref-name>java:comp/env/jms/topicRef</resource-env-ref-name>
    <resource-env-ref-type>javax.jms.Topic</resource-env-ref-type>
    <lookup-name>jms/myTopic</lookup-name>
  </resource-env-ref>

或者如果您的资源引用缺少lookup-name,而是拥有一个带有绑定名称的ibm-web-bnd.xml文件,

  <resource-ref name="java:comp/env/jms/topicRef" binding-name="jms/myTopic">
  </resource-ref>

然后将jms / myTopic指定为主题的JNDI名称。 然后,应用程序代码即可:

Topic topic = InitialContext.doLookup("java:comp/env/jms/topicRef");

一些优化/特殊情况: 如果您既没有查找名称也没有绑定名称,那么WebSphere Application Server将通过资源引用名称来计算缺省绑定。如果您的资源参考是这种情况,那么您将拥有一个如下的部署描述符,而没有任何绑定文件,

  <resource-ref>
    <res-ref-name>jms/myTopicConnectionFactory</res-ref-name>
    <res-type>javax.jms.TopicConnectionFactory</res-type>
  </resource-ref>

在上述情况下,将jms / myTopicConnectionFactory指定为JNDI名称。 该应用程序可以将其查找为

TopicConnectionFactory tcf = InitialContext.doLookup("java:comp/env/jms/myTopicConnectionFactory");