2013-12-16 153 views
0

嗨StackOverflow社区,无法使用JNDI连接到Websphere MQ

我目前使用Spring连接到一个队列。我希望能够在我们的测试VS我们的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的。但是当切换提供者类时,它给了我以下例外。

春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管理队列如上所述
  2. 密码设置不起作用弹簧配置

任何人都可以提供一些指导?如果您之前遇到过这个问题,那么解决方案是什么?

我肯定的答案在我的脸盯着权,只是在我的眼睛有些雾:)

感谢,

何塞

+0

我相信你已经看过这个http://stackoverflow.com/questions/12889953/unable-to-connect-to-queue-manager-in-websphere-mq-7-1 – Ashish

回答

0

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

WMQInitialContextFactory来自SupportPac ME01,由IBM员工编写,仅作为开发的简单工具 - 永远不会用于生产。 SupportPac ME01不推荐用于简单开发之外的应用。大多数IBM MQ人员都表示永远不会使用它。另外,IBM不支持WMQInitialContextFactory。

谁曾告诉您使用WMQInitialContextFactory需要根据IBM MQ最佳实践进行自我刷新。

+0

感谢您的澄清。你碰巧有一个IBM链接或一些阻止WMQInitialContextFactory使用的文档?这只是为了我的理解。 –

+1

这个答案说不使用它,但没有谈论使用什么。请不要给不完整的答案 – shaILU

0

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

移动以使用简单的文件系统上下文;与QM的正常连接是否可以进行消息传递?它只是受保护的WMQ管理队列或与MQ的正常连接?

+0

我不知道你在说什么。 IBM的MQ最佳实践是使用(1)基于文件的JNDI或(2)LDAP JNDI。就MQ安全性而言,它是队列管理器的OAM,它处理用户ID /组对MQ对象的授权。即请参阅setmqaut/dspmqaut命令以获取更多信息。 – Roger

1

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

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

2035 0x000007f3 MQRC_NOT_AUTHORIZED

当用户没有被授权执行该被尝试的功能原因 MQRC 2035(MQRC_NOT_AUTHORIZED)被返回。

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

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

但是,听取其他人关于JNDI,他们知道他们在说什么。

相关问题