无法使用 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 错误