无法使用 JNDI 连接到 Websphere MQ

Posted

技术标签:

【中文标题】无法使用 JNDI 连接到 Websphere MQ【英文标题】:Unable to connect to Websphere MQ using JNDI 【发布时间】:2013-12-16 16:25:12 【问题描述】:

您好 *** 社区,

我目前正在使用 Spring 连接到队列。我希望能够在我们的测试和 UAT 环境中配置我可以连接的提供商。在 UAT 中,我们使用 IBM WMQ 7;在测试中,我们使用的是 ActiveMQ。

我们也在这两种情况下使用 SSL 连接。

目前,我们有以下配置可用于连接到 WMQ 7:

<bean id="jmsFactory" name="jmsFactory" class="com.ibm.mq.jms.MQConnectionFactory">
    <property name="queueManager" value="$UM_MQ_QM" />
    <property name="hostName" value="$UM_MQ_HOST" />
    <property name="channel" value="$UM_MQ_CHANNEL" />
    <property name="port" value="$UM_MQ_PORT" />
    <property name="transportType" value="1" />
    <property name="SSLCipherSuite" value="$SSL_CIPHER_SUITE" />
</bean>

使用 JNDI,我可以连接到 ActiveMQ。但是在切换提供者类时,它给了我以下异常。

Spring JNDI 配置:

<bean id="jmsFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="QueueConnectionFactory" />
  <property name="jndiTemplate" ref="jndiTemplate" /> 
</bean>

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
  <property name="environment">
    <props>
      <prop key="java.naming.factory.initial">com.ibm.mq.jms.context.WMQInitialContextFactory</prop>
      <prop key="java.naming.provider.url">$UM_MQ_HOST:$UM_MQ_PORT/$UM_MQ_CHANNEL</prop>
    </props>
  </property>
</bean>

例外:

Caused by: javax.naming.NamingException: Caught an Exception trying to create the admin queue. Exception was: com.ibm.mq.pcf.PCFException: MQJE001: Completion Code '2', Reason '2035'. [Root exception is com.ibm.mq.pcf.PCFException: MQJE001: Completion Code '2', Reason '2035'.]
   at com.ibm.mq.jms.context.MQContext.<init>(MQContext.java:294)
   at com.ibm.mq.jms.context.WMQInitialContextFactory.getInitialContext(WMQInitialContextFactory.java:29)
   at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
   at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
   at javax.naming.InitialContext.init(InitialContext.java:223)
   at javax.naming.InitialContext.<init>(InitialContext.java:197)
   at org.springframework.jndi.JndiTemplate.createInitialContext(JndiTemplate.java:136)
   at org.springframework.jndi.JndiTemplate.getContext(JndiTemplate.java:103)
   at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:85)
   at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
   at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178)
   at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
   at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)
   at org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:201)
   at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:187)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1545)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1483)
   ... 109 more
Caused by: com.ibm.mq.pcf.PCFException: MQJE001: Completion Code '2', Reason '2035'.
   at com.ibm.mq.pcf.PCFMessageAgent.send(PCFMessageAgent.java:241)
   at com.ibm.mq.jms.context.MQContext.<init>(MQContext.java:273)
   ... 125 more

我怀疑这是由于两件事:

    我们没有在上述 JMS 管理队列上设置明确的权限 Cipher 设置在 Spring 配置中不起作用

谁能提供一些指导?如果您以前遇到过这个问题,解决方案是什么?

我确定答案正盯着我看,只是我的眼里有些迷雾:)

谢谢,

何塞

【问题讨论】:

相信你已经看过这个***.com/questions/12889953/… 【参考方案1】:

您将获得 2035 的 MQ 原因代码,这意味着: 问题(摘要)

您正在获得 MQRC 2035,未在您的 WebSphere MQ 应用程序或通道中授权。您需要了解导致此故障的原因。

2035 0x000007f3 MQRC_NOT_AUTHORIZED

原因 当用户无权执行所尝试的功能时,返回 MQRC 2035 (MQRC_NOT_AUTHORIZED)。

解决问题 当用户无权执行该功能时,返回 MQRC 2035 (MQRC_NOT_AUTHORIZED)。确定用户无法访问的对象,并为用户提供对该对象的访问权限。

调试技巧: 使用 dspmqaut(显示权限命令)来确定用户是否具有访问预期对象的权限。

但是,听听其他人关于 JNDI 的看法,他们知道自己在说什么。

【讨论】:

【参考方案2】:

您不想使用 WMQInitialContextFactory。使用基于文件的 JNDI 或真正的 JNDI 注册表。

WMQInitialContextFactory 来自 IBM 员工编写的 SupportPac ME01,它是一个仅用于开发的简单工具 - 永远不会用于生产。不建议将 SupportPac ME01 用于简单开发之外的用途。大多数 IBM MQ 人说永远不要使用它。此外,IBM 不支持 WMQInitialContextFactory。

谁曾告诉您使用 WMQInitialContextFactory 需要重新了解 IBM MQ 最佳实践。

【讨论】:

感谢您的澄清。您是否碰巧有阻止使用 WMQInitialContextFactory 的 IBM 链接或一些文档?这只是为了我的理解。 这个答案说不要使用它,但没有谈论使用什么。请不要给出不完整的答案【参考方案3】:

我建议您在此处考虑使用支持 LDAP 的 JNDI 上下文进行全面部署。文件系统上下文来自 Oracle,因为生产环境也不支持 AFAIK。

移动到使用简单的文件系统上下文;与 QM 的正常连接是否适用于消息传递?只是受保护的 WMQ Admin 队列还是与 MQ 的正常连接?

【讨论】:

我不知道你在说什么。 IBM 的 MQ 最佳实践是使用 (1) 基于文件的 JNDI 或 (2) LDAP JNDI。就 MQ 安全而言,队列管理器的 OAM 按 UserID/Groups 处理对 MQ 对象的授权。即参见 setmqaut/dspmqaut 命令了解更多信息。

以上是关于无法使用 JNDI 连接到 Websphere MQ的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Websphere 服务器连接到 Weblogic JMS?

FileNet 配置管理器无法连接到 WebSphere Application Server

Websphere Application Server异常ADMC0016E:系统无法创建SOAP连接器以连接到主机端口

Struts/Spring WebSphere jndi 错误

连接到 IBM Websphere MQ 时出现 NullPointerException

谁能告诉我一种使用用户提供的服务从云铸造厂连接到 Websphere MQ 的方法