我正在尝试使用JMS和客户机通道定义表(CCDT)连接到IBM
MQ。当我分别指定MQ属性时,我能够成功连接到QueueManager。但是,当我尝试使用CCDT文件时,出现以下异常。
由于客户端通道定义表(CCDT)用于确定客户端应用程序用来连接到队列管理器的通道定义,因此我没有设置QueueManager名称。
ERROR> com.ssc.ach.mq.JMSMQReceiver[main]: errorMQJMS2005: failed to create MQQueueManager for ''
javax.jms.JMSException: MQJMS2005: failed to create MQQueueManager for ''
at com.ibm.mq.jms.services.ConfigEnvironment.newException(ConfigEnvironment.java:586)
at com.ibm.mq.jms.MQConnection.createQM(MQConnection.java:2110)
at com.ibm.mq.jms.MQConnection.createQMNonXA(MQConnection.java:1532)
at com.ibm.mq.jms.MQQueueConnection.<init>(MQQueueConnection.java:150)
at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:174)
at com.ibm.mq.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:1066)
Iam使用该.setCCDTURL(ccdt);
方法来设置CCDT URL。
private MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
mqQueueConnectionFactory.setCCDTURL(ccdt);
queueConnection = mqQueueConnectionFactory.createConnection(username, pwd);
当我尝试使用以下配置而不是CCDT文件进行连接时,它将连接到MQ。
mqQueueConnectionFactory.setHostName(host);
mqQueueConnectionFactory.setChannel(channel);
mqQueueConnectionFactory.setPort(port);
mqQueueConnectionFactory.setQueueManager(qManager);
mqQueueConnectionFactory.setTransportType(1);
我是否需要同时设置setQueueManager和CCDT文件,如异常所示 failed to create MQQueueManager for ''
CCDT不能在文本编辑器中读取,它是二进制格式的文件。CCDT中每个CLNTCONN
通道的参数之一是QMNAME
。知道在CCDT中QMNAME
设置了什么以及CLNTCONN
您定义了多少个通道以及要完成什么,将有助于弄清楚应该使用来指定什么值setQueueManager
。
如果只有一个CLNTCONN
通道,则可以指定以下内容,并且无论QMNAME属性设置为什么,它都将使用单个通道进行连接:
setQueueManager("*");
如果文件中有多个CLNTCONN
通道,每个通道QMNAME
指定了不同的通道,则假设该名称与侦听与该通道关联的主机和端口上的实际队列管理器名称匹配,您将传递队列管理器名称:
setQueueManager("QMGRNAME");
如果文件中有多个CLNTCONN
通道,每个通道都QMNAME
指定了相同的名称,而该名称并不意味着反映监听每个通道相关主机和端口的实际队列管理器名称,则称为队列管理器组,这将适用于希望客户端连接到任意数量的不同主机和端口的位置,并且您不需要知道要连接到哪个队列管理器,在这种情况下,您将传递以前缀的队列管理器组名*
:
setQueueManager("*QMGRGROUPNAME");
上面的另一种变体是,如果文件中有多个CLNTCONN
通道,每个通道都QMNAME
指定了所有空白(空格)或NULL
,则这称为队列管理器组,这将用于您希望客户端连接到任何数量的不同主机和端口,您无需知道要连接到哪个队列管理器,在这种情况下,您可以将队列管理器名称作为单个空格``或完全不传递’‘:
setQueueManager(" ");
//or
setQueueManager("");
如果您根本不使用setQueueManager,则上面的最后一个用例可能会起作用。
如果要查看CCDT的内容,可以使用MQ v8和更高版本的客户机或服务器安装中附带的runmqsc命令。
对于Unix ksh / bash shell,请使用以下命令:
export MQCHLLIB=PATH/OF/CCDT
export MQCHLTAB=NAME_OF_CCDT
runmqsc -n
对于Windows,请使用以下命令:
set MQCHLLIB=PATH/OF/CCDT
set MQCHLTAB=NAME_OF_CCDT
runmqsc -n
runmqsc程序启动并显示后,Starting local MQSC for 'NAME_OF_CCDT'.
您可以运行以下命令来查看通道详细信息:
DIS CHL(*)
下面是更具体的命令,用于缩小返回的字段数:
DIS CHL(*) QMNAME CONNAME
我试图通过TLS连接到使用JMS的IBM MQ。我将TLS_RSA_WITH_AES_256_CBC_SHA256设置为IBM MQ控制台通道上的SSL密码规范。 在连接工厂中,我执行以下操作: 我得到: 我不确定这个错误是否意味着握手失败(由于证书/密钥库配置错误)或其他原因。
使用Websphere MQ Explorer,我为JMS创建了一个新的基于初始上下文的文件系统。使用新的初始上下文,我创建了一个JMS队列来连接到现有队列(当前使用非基于java的框架访问)。 在应用程序代码中,我可以成功连接到上下文,如下所示: 接下来,我创建一个QueueConnectionFactory: 但是,这会引发以下异常: 我使用了com。ibm。mq。jms。MQQueueFac
我正在尝试使用IntelliJ在WildFly 19中创建一个简单的JMS ActiveMQ连接。我遵循了安装指南,但遇到了连接错误。 我将Wildfly作为本地服务器运行,处于独立模式。我已经更新了IntelliJ中的启动脚本环境变量,以指向standalone-full.xml(显然我需要使用,以便使用JMS?) 我已经更新了XML文件,以便在代码中添加要连接的JMS队列: EAR正在部署,J
我一直有这样一个错误(异常)com.ibm.msg.client.jms.detailedJMSSecurityException:JMSWMQ2013:为连接模式为“Client”、主机名为“LocalHost(1414)”的队列管理器“QM1”提供的身份验证安全性无效。检查所连接的等待队列管理器中提供的用户名和密码是否正确。WebSphere MQ调用失败,完成代码为'2'('mqcc_fai
在Weblogic中,我将JMS模块配置为“外部服务器”类型。在模块中,我设置了一个连接工厂,它有一个本地JNDI名称和一个远程JNDI名称。 我正在使用下面的Spring配置来尝试获取连接,但我在jndiName上不断遇到一个“name not found”错误,其中包含我尝试过的各种名称字符串。 有什么建议我可以试试吗?
请救命!我的连接方式与我在另一个项目中所做的完全相同。我已经搜索了StackOverflow和互联网,但仍然找不到补救方法。 我尝试过的事情: > 重新启动项目和STS WebApp>参考资料>CSS>Main.css路径 link rel=“stylesheet”type=“text/css”href=“${PageContext.Request.ContextPath}/css/style.c