ejb-jar.xml 中的激活配置属性未在 WebLogic 中的 MQ ActivationSpecification 上设置

activation-config-properties in ejb-jar.xml not being set on MQ ActivationSpecification in WebLogic

我正在尝试在 WebLogic Server 内部配置 IBM MQ 资源适配器 (MQ-RA),以便通过激活规范 (ActSpec) 从 MQ 队列管理器 (QMgr) 向消息驱动的 bean (MDB) 发送入站消息) 由 MQ-RA 提供。

我遇到的问题是我在我的 MDB 的 ejb-jar.xml 部署描述符中指定的 activation-config-property XML 定义(特别是 ConnectionFactoryLookup 和 DestinationLookup)没有被由 WebLogic 在 MQ-RA 提供的 ActSpec 对象上设置。因此,当部署 MDB 并且 WebLogic 根据 JCA 规范调用 endpointActication 时,它无法连接到 MQ 队列管理器 (QMgr) - 因为它正在尝试使用默认连接选项而不是在 ConnectionFactoryLookup 属性.

引用的 JNDI CF 中定义的那些

我的理解是,当 [=84] 时,EJB 容器 (WebLogic) 应该根据 activation-config-property 条目为 MQ-RA 提供已配置的 ActSpec,该 ActSpec 上设置了配置信息=] 消息端点实例。

所以我的问题是:

为什么 ejb-jar.xml 文件中的这些 activation-config-property 条目没有在从 MQ-RA 创建的 ActSpec 上设置?

(稍加考虑:如果我为出站消息部署一个简单的 Servlet 应用程序,那么这一切都很好,并且 EJB 应用程序使用部署的 MQ-RA 在从JNDI。所以看起来 MQ-RA 部署正常并且它的 类 可用。)

下面,我将解释到目前为止我是如何设置 WebLogic 服务器的,以及我是如何部署我的 EJB 应用程序和 MQ-RA 的。如果有人可以在正确的方向上提出一些建议或推动,以便我可以针对 WebLogic 中的 MQ-RA 成功部署我的 MDB 应用程序,那将不胜感激! :-)


使用的产品版本:

WebLogic V12.2.1.2.0

MQ 服务器和 RA V9.0.0.0

采取的配置步骤:

  1. 创建了一个基于文件的 JNDI 存储 (.bindings) 来保存 MQ JMS ConnectionFactory 和 MQ JMS Destination 对象。
  2. 在 WLS 中定义了一个 "Foreign JNDI Provider",初始上下文工厂 "com.sun.jndi.fscontext.RefFSContextFactory" 指向我的 .bindings 文件。
  3. 创建了两个具有本地 JNDI 名称(jms/CF 和 jms/Dest)的外部 JNDI 链接映射到我的 .bindings 文件中的远程 JNDI 名称。
  4. 部署了 MQ-RA(通过 WLS 管理控制台上的安装按钮)"as an application"(不是库),给它 JNDI 名称 "mqrajndi" 并将 "Global Access To Classes Enabled" 设置为是的。
  5. 以下是要部署的 MDB 应用程序的 ejb-jar.xml 片段,显示了 activation-config-property 设置 message-driven 父元素的子元素.:

    <activation-config> <activation-config-property> <activation-config-property-name>DestinationLookup</activation-config-property-name> <activation-config-property-value>jms/Dest</activation-config-property-value> </activation-config-property> <activation-config-property> <activation-config-property-name>ConnectionFactoryLookup</activation-config-property-name> <activation-config-property-value>jms/CF</activation-config-property-value> </activation-config-property> </activation-config>

  6. 在 ejb-jar.xml 附带的 weblogic-ejb-jar.xml 文件中,我使用部署后指定的 JNDI 名称将 MDB 绑定到 MQ-RA MQ-RA:

    <weblogic-enterprise-bean> <ejb-name>BASIC_MDB</ejb-name> <message-driven-descriptor> <resource-adapter-jndi-name>mqrajndi</resource-adapter-jndi-name> </message-driven-descriptor> </weblogic-enterprise-bean>

  7. 将 MDB 作为应用程序部署,并观察它在 endpointActivation 调用期间无法连接到我的 QMgr,出现异常 JMSWMQ0018:无法连接到队列管理器'' 连接模式 'Client' 和主机名 'localhost(1414)'.

经过更多的尝试,我找到了解决办法。在这里发布答案以防对其他人有帮助:-)

我的 ejb-jar.xml 文件中列出的 activation-config-property 属性均以 upper-case 字符开头,例如:

<activation-config-property-name>DestinationLookup</activation-config-property-name>

这似乎意味着 WebLogic Server 没有在初始化 MDB 时传递给 endpointActivation(MessageEndpointFactory, ActivationSpec) 调用的 MQ-RA com.ibm.mq.connector.inbound.ActivationSpecImpl 对象上设置它们。

无论如何,将它们更改为具有 lower-case 起始字符,如下所示:

<activation-config-property-name>destinationLookup</activation-config-property-name>

使 WebLogic 在 MQ-RA ActSpecImpl 对象实例上设置它们,以便正确配置它。

我在服务器日志中找不到任何说明 ActSpec 属性 的第一个字符的大小写很重要或任何被忽略的文档或参考。所以这很烦人,grrrrr!

解决这个问题后,我遇到的第二个小问题是 java.lang.ClassCastException JNDI 中的 JMS 连接工厂通过 "connectionFactoryLookup" activation-config-property 引用。当我使用基于文件(.bindings)的 JNDI 时,它没有创建 JMS MQ 连接工厂实例的权限,因此无法从中提取连接信息。删除此 属性 并在 ejb-jar.xml 文件中明确设置主机名、端口、通道:

<activation-config-property>
    <activation-config-property-name>port</activation-config-property-name>
    <activation-config-property-value>1418</activation-config-property-value>
    </activation-config-property>
<activation-config-property>
    <activation-config-property-name>channel</activation-config-property-name>
    <activation-config-property-value>WEBLOGIC.SVRCONN</activation-config-property-value>
</activation-config-property>
<activation-config-property>
    <activation-config-property-name>hostName</activation-config-property-name>
    <activation-config-property-value>myhost.mydomain.com</activation-config-property-value>
</activation-config-property>

解决了问题。