我正在尝试通过MQ提供的激活规范(ActSpec)将Web MQ服务器内部的IBM MQ资源适配器(MQ-RA)配置为从MQ队列管理器(QMgr)到消息驱动Bean(MDB)进行配置-RA .
我遇到的问题是我在我的MDB的ejb-jar.xml部署描述符中指定的 activation-config-property
XML定义(特别是ConnectionFactoryLookup和DestinationLookup)不是由WebLogic在MQ-RA提供的ActSpec对象上设置的 . 因此,当部署MDB并且WebLogic按照JCA规范调用 endpointActication
时,它无法连接到MQ队列管理器(QMgr) - 因为它尝试使用默认连接选项进行连接,而不是使用默认连接选项进行连接 . ConnectionFactoryLookup属性引用的JNDI CF.
我的理解是EJB容器(WebLogic)应该在创建/激活消息 endpoints 实例时,为MQ-RA提供已配置的ActSpec,该ActSpec已根据 activation-config-property
条目设置了配置信息 .
所以我的问题:
为什么ejb-jar.xml文件中的这些 activation-config-property
条目没有在从MQ-RA创建的ActSpec上设置?
(稍微说:如果我为出站消息传递部署一个简单的Servlet应用程序,那么这一切都很有效,并且EJB应用程序使用部署的MQ-RA在从JNDI查找ConnectionFactory和Destination后将消息发送到MQ QMgr . 所以它看起来好像MQ-RA部署好了,它的类可用 . )
下面,我将解释我到目前为止如何设置WebLogic服务器以及我如何部署EJB应用程序和MQ-RA . 如果有人可以在正确的方向上提出一些建议或推动,以便我可以成功地在WebLogic中部署我的MDB应用程序,那将非常感谢! :-)
Product Versions Used:
WebLogic V12.2.1.2.0
MQ Server和RA V9.0.0.0
Configuration Steps Taken:
-
创建了基于文件的JNDI存储(.bindings)以保存MQ JMS ConnectionFactory和MQ JMS目标对象 .
-
在WLS中定义"Foreign JNDI Provider",初始上下文工厂"com.sun.jndi.fscontext.RefFSContextFactory"指向我的.bindings文件 .
-
创建了两个外部JNDI链接,其本地JNDI名称(jms / CF和jms / Dest)映射到我的.bindings文件中的远程JNDI名称 .
-
部署了MQ-RA(通过WLS管理控制台上的“安装”按钮)"as an application"(不是库),为其提供JNDI名称"mqrajndi"并将"Global Access To Classes Enabled"设置为true .
-
以下是ejb-jar.xml中要部署的MDB应用程序的片段,显示
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文件中,我使用部署MQ-RA后指定的JNDI名称将MDB绑定到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异常:无法连接到队列管理器'' with connection mode ' Client ' and host name ' localhost(1414)' .
1 回答
经过多一点玩,我找到了解决方案 . 在这里发布答案以防其他人:-)
我的ejb-jar.xml文件中列出的
activation-config-property
属性都以大写字符开头,例如:这似乎意味着WebLogic Server没有在初始化MDB时传递给
endpointActivation(MessageEndpointFactory, ActivationSpec)
调用的MQ-RAcom.ibm.mq.connector.inbound.ActivationSpecImpl
对象上设置它们 .无论如何,将它们更改为具有小写起始字符,如下所示:
使WebLogic在MQ-RA ActSpecImpl对象实例上设置它们,以便正确配置它 .
我在服务器日志中找不到任何文档或引用来说明ActSpec属性的第一个字符的大小是重要的,或者任何被忽略的大小写 . 所以这很烦人,grrrrr!
解决这个问题之后,我遇到的第二个小问题是java.lang.ClassCastException,JNDI中的JMS连接工厂通过“connectionFactoryLookup”activation-config-property引用 . 当我使用基于文件(.bindings)的JNDI时,它没有创建JMS MQ连接工厂实例的权限,因此无法从中提取连接信息 . 删除此属性并在ejb-jar.xml文件中显式设置hostName,port,channel:
做了诀窍并整理了问题 .