从Java客户端获取JMSException连接到IBM MQ

问题描述

我们正在尝试从Java客户端连接到IBM MQ。我们已经使用JMSAdmin实用程序为JNDI上下文生成.bindings。连接到IBM MQ时,出现以下异常:

ERR fmbaJMS JMSException: JMSWMQ0018: Failed to connect to queue manager '<queue manager name>' with connection mode 'Client' and host name 'null' 

.bindings文件正确具有时,发送的主机名参数为空

mq/RefAddr/30/Content=localhost(51410)
mq/RefAddr/30/Type=CRSHOSTS 

指向localhost和端口51410的条目。

解决方法

您的.bindings文件看起来不正确。您用来创建它的JMSAdmin命令是什么?

MQ0018:无法连接到队列管理器'bt.qm.ccxp0'

是您的队列管理器名称还是QCF?注意:根据IBM Best Practises,队列管理器名称应为大写。

要定义QCF(队列连接工厂),请执行以下操作:

DEFINE QCF(myQCF) QMANAGER(MQA1) CHANNEL(TEST.CHL) HOSTNAME(127.0.0.1) PORT(1414) TRANSPORT(CLIENT) FAILIFQUIESCE(YES)

要定义JMS队列,请执行以下操作:

DEFINE Q(mqs.dev.test.q) QUEUE(TEST.Q1) QMANAGER(MQA1) TARGCLIENT(JMS) FAILIFQUIESCE(YES)

然后在您的代码中,您将执行以下操作以从MQ JNDI加载对象:

Hashtable<String,String> env = new Hashtable<String,String>();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL,"file:/C:/JNDI-Directory");

Context ctx = new InitialContext(env);

QueueConnectionFactory cf = (QueueConnectionFactory) ctx.lookup("myQCF");
Queue q = (Queue) ctx.lookup("mqs.dev.test.q");