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
采取的配置步骤:
- 创建了一个基于文件的 JNDI 存储 (.bindings) 来保存 MQ JMS ConnectionFactory 和 MQ JMS Destination 对象。
- 在 WLS 中定义了一个 "Foreign JNDI Provider",初始上下文工厂 "com.sun.jndi.fscontext.RefFSContextFactory" 指向我的 .bindings 文件。
- 创建了两个具有本地 JNDI 名称(jms/CF 和 jms/Dest)的外部 JNDI 链接映射到我的 .bindings 文件中的远程 JNDI 名称。
- 部署了 MQ-RA(通过 WLS 管理控制台上的安装按钮)"as an application"(不是库),给它 JNDI 名称 "mqrajndi" 并将 "Global Access To Classes Enabled" 设置为是的。
以下是要部署的 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>
在 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>
将 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>
解决了问题。
我正在尝试在 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 属性.
我的理解是,当 [=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
采取的配置步骤:
- 创建了一个基于文件的 JNDI 存储 (.bindings) 来保存 MQ JMS ConnectionFactory 和 MQ JMS Destination 对象。
- 在 WLS 中定义了一个 "Foreign JNDI Provider",初始上下文工厂 "com.sun.jndi.fscontext.RefFSContextFactory" 指向我的 .bindings 文件。
- 创建了两个具有本地 JNDI 名称(jms/CF 和 jms/Dest)的外部 JNDI 链接映射到我的 .bindings 文件中的远程 JNDI 名称。
- 部署了 MQ-RA(通过 WLS 管理控制台上的安装按钮)"as an application"(不是库),给它 JNDI 名称 "mqrajndi" 并将 "Global Access To Classes Enabled" 设置为是的。
以下是要部署的 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>
在 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>
将 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>
解决了问题。