假设您通过资源引用(在部署描述符中定义)访问资源,配置的 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>
或者如果您的资源引用缺少查找名称,而您有一个带有绑定名称的 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>
或者如果您的资源引用缺少查找名称,而您有一个带有绑定名称的 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");