首页 文章

ejb-jar.xml中的activation-config-properties未在WebLogic中的MQ ActivationSpecification上设置

提问于
浏览
1

我正在尝试通过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 回答

  • 3

    经过多一点玩,我找到了解决方案 . 在这里发布答案以防其他人:-)

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

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

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

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

    <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文件中显式设置hostName,port,channel:

    <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>
    

    做了诀窍并整理了问题 .

相关问题