问题描述
我正在尝试将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");