Spring与WebSphere JMS IBM MQ提供程序的集成

Spring与WebSphere JMS IBM MQ提供程序的集成,jms,spring-integration,ibm-mq,Jms,Spring Integration,Ibm Mq,我们有一个WebSphereJMS队列和QueueConnectionFactory,提供程序为IBMMQ。我们无法直接连接到IBM MQ 我有下面的配置——我有BeanJMSConnectionFactory,它按照预期使用InitialContext创建工厂。_队列是我的队列的JNDI名称 <int-jms:inbound-channel-adapter channel="transformedChannel" connection-factory="jmsConnectionFact

我们有一个WebSphereJMS队列和QueueConnectionFactory,提供程序为IBMMQ。我们无法直接连接到IBM MQ

我有下面的配置——我有BeanJMSConnectionFactory,它按照预期使用InitialContext创建工厂。_队列是我的队列的JNDI名称

<int-jms:inbound-channel-adapter channel="transformedChannel" connection-factory="jmsConnectionFactory" 
destination-name="THE_QUEUE">
<int:poller fixed-delay="500" />
</int-jms:inbound-channel-adapter>

它因错误而失败

原因:com.ibm.msg.client.jms.DetailedInvalidDestinationException: JMSWMQ2008:无法打开MQ队列“THE_queue”。JMS试图 执行MQOPEN,但WebSphere MQ报告了错误。使用链接的 异常以确定此错误的原因。检查 指定的队列和队列管理器定义正确

我的出站通道配置

<int-jms:outbound-channel-adapter id="respTopic" 
connection-factory="jmsConnectionFactory" 
destination-name="THE_REPLYQ" channel="process-channel"/>

如果我使用java代码,它可以工作 从session.createProducer创建MessageProducer并发送消息, 在queuesession.createConsumer(outQueue)上创建MessageConsumer;和接收()

请提供帮助,了解如何使用spring集成和流程消息为这些队列创建jms入站和出站适配器

编辑:

@Bean
公共连接工厂jmsConnectionFactory(){
ConnectionFactory ConnectionFactory=null;
上下文ctx=null;
属性p=新属性();
p、 put(Context.INITIAL\u Context\u FACTORY,“com.ibm.websphere.naming.WsnInitialContextFactory”);
p、 put(Context.PROVIDER\u URL,“iiop://hostname.sl");
p、 put(“com.ibm.CORBA.ORBInit”、“com.ibm.ws.sib.client.ORB”);
试一试{
ctx=新的初始上下文(p);
如果(null!=ctx)
System.out.println(“获取命名上下文”);
connectionFactory=(QueueConnectionFactory)ctx.lookup
(“BDQCF”);
}...
@豆子
公共JmsListenerContainerFactory mydbFactory(连接工厂jmsConnectionFactory,
DefaultJmsListenerContainerFactoryConfigurer(配置器){
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();
configurer.configure(工厂,jmsConnectionFactory);
返回工厂;
}
代码和配置适用于使用WebSphere默认JMS提供程序的队列

EDIT2:注释后添加的代码

<int:channel id="jmsInputChannel" />
  <jee:jndi-lookup id="naarconnectionFactory" jndi-name="MQ_QUEUE" resource-ref="false">
   <jee:environment>
      java.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory
      java.naming.provider.url=iiop://host.ws
   </jee:environment>
</jee:jndi-lookup>

<int-jms:inbound-channel-adapter id="jmsIn"  channel="jmsInputChannel" 
connection-factory="jmsNAARConnectionFactory" destination-name="naarconnectionFactory">
   <int:poller fixed-delay="500" />
</int-jms:inbound-channel-adapter>

java.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory
java.naming.provider.url=iiop://host.ws

您不能只在那里使用JNDI名称-您必须执行JNDI查找以将其解析到
目标
-请参阅。

您好,Gary,我认为JNDI查找没有问题。我的bean正在执行-Properties(),初始上下文工厂,提供程序URL ORBInit,并通过查找查找来查找queueconnectionfactory。我还有一个创建JmsListenerContainerFactory的bean。可以吗?你误解了我的意思;你不能在这里使用JNDI名称
destination name=“THE_QUEUE”
-您必须执行JNDI查找以获取目标,然后使用
目标-=“queueFromJNDILookup”
。或者在不使用JNDI的情况下将目标配置为
。请参阅EDIT2:获取由以下原因引起的错误:com.ibm.mq.MQException:JMSCMQ0001:WebSphere mq调用失败,compcode'2'('MQCC_failed')'2035'('MQRC_NOT_AUTHORIZED')。位于com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:204)@Kriswat Gary的回答解决了您最初的问题。2035表示队列管理器拒绝请求是因为某种权限问题,可能有很多原因。我建议您接受Gary对您最初问题的回答。在堆栈溢出上搜索,并在谷歌上搜索2035错误(这里已经有很多问题要解决了)。如果你找不到原因,那么就打开一个与2035年发行的相关的新问题。
<int:channel id="jmsInputChannel" />
  <jee:jndi-lookup id="naarconnectionFactory" jndi-name="MQ_QUEUE" resource-ref="false">
   <jee:environment>
      java.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory
      java.naming.provider.url=iiop://host.ws
   </jee:environment>
</jee:jndi-lookup>

<int-jms:inbound-channel-adapter id="jmsIn"  channel="jmsInputChannel" 
connection-factory="jmsNAARConnectionFactory" destination-name="naarconnectionFactory">
   <int:poller fixed-delay="500" />
</int-jms:inbound-channel-adapter>