无法使用JNDI连接到Websphere MQ

时间:2013-12-16 16:25:13

标签: java spring activemq ibm-mq mq

您好StackOverflow社区,

我目前正在使用Spring连接到队列。我希望能够在我们的测试VS我们的UAT环境中配置我可以连接的提供商。在UAT中,我们使用IBM WMQ 7;在Test中,我们使用的是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

我怀疑这是由于两件事:

  1. 我们没有在上面列出的JMS Admin队列中设置显式权限
  2. Cipher设置在Spring配置中不起作用
  3. 有人可以提供一些指导吗?如果您之前遇到过这个问题,那么解决方案是什么?

    我确信答案是正确地盯着我,只是在我的眼中有些迷雾:)

    谢谢,

3 个答案:

答案 0 :(得分:1)

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

您正在WebSphere MQ应用程序或渠道中获取MQRC 2035,未授权。您需要了解导致此失败的原因。

2035 0x000007f3 MQRC_NOT_AUTHORIZED

原因 当用户未被授权执行尝试的功能时,将返回MQRC 2035(MQRC_NOT_AUTHORIZED)。

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

调试技巧: 使用dspmqaut(display authority命令)确定用户是否具有访问目标对象的权限。

但是,听听JNDI的其他人,他们知道他们在谈论什么。

答案 1 :(得分:0)

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

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

谁告诉过你使用WMQInitialContextFactory需要在IBM MQ最佳实践中刷新自己。

答案 2 :(得分:0)

我建议你考虑在这里使用LDAP支持的JNDI上下文进行全面部署。文件系统上下文来自Oracle,并且AFAIK也不支持生产环境。

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