您好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
我怀疑这是由于两件事:
有人可以提供一些指导吗?如果您之前遇到过这个问题,那么解决方案是什么?
我确信答案是正确地盯着我,只是在我的眼中有些迷雾:)
谢谢,
何
答案 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的正常连接?