我正在使用IBM WebSphere MQ。每当并发用户登录到IBM MQ时,当第二个用户到达并尝试访问getqueue时,他们会收到2100 0x00000834 MQRC_OBJECT_ALREADY_EXISTS
错误。请提供一些建议。
连接到MQ Manager:
mqQueueManager = new MQQueueManager(mqQueueManagerName);
打开Put Queue:
mqPutQueue = mqQueueManager.AccessQueue(mqRequestQueueName, MQC.MQOO_INQUIRE |
MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING);
当第二个用户尝试连接时,打开ReplyTo队列会生成错误。第一个用户的动态队列在断开连接时将被删除。在第一个用户关闭应用程序之前,第二个用户无法连接:
mqGetQueue = mqQueueManager.AccessQueue(mqModelQueueName, MQC.MQOO_INPUT_SHARED ,
mqQueueManagerName, mqReplyQueueName, "");
答案 0 :(得分:1)
您可能错误地指定了动态队列名称。
为了向开发人员提供最大的灵活性,WebSphere MQ允许在为动态队列选择所需的确切名称或让WebSphere MQ自动生成唯一名称之间进行选择。如果您希望WebSphere MQ为您生成名称,请确保您传入的名称足够短以允许WMQ追加其他字符,并将星号指定为DynamicQName
字段中的最后一个字符。这在名为Creating Dynamic Queues的部分的文档中进行了解释,内容如下:
您可以通过三种方式指定您创建的动态队列的名称:
DynamicQName
字段中提供所需的全名
MQOD结构。 DynamicQName
字段。不要为其指定单个星号()
动态队列名称。 DynamicQName
字段的字符位置。根据您描述的行为,我猜测您传递给WMQ的名称中没有星号。因此,它假定您要明确指定名称并完全按照您指定的名称进行操作,尽管可能不是您的意图。
要获得您期望的行为,请确保您为mqReplyQueueName
传递的值是单个星号(“*
”字符),或者是一个少于33个字符的字符串,其结尾为星号。