在查询通道以获取有关连接到给定队列管理器的主机的信息时,PCF消息代理存在问题。 PCFAgent的代码是
MQGetMessageOptions getMessageOptions = new MQGetMessageOptions();
getMessageOptions.options = MQC.MQGMO_BROWSE_NEXT + MQC.MQGMO_NO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING;
messageAgent = new PCFMessageAgent(MQEnvironment.hostname, MQEnvironment.port, MQEnvironment.channel);
期权的代码是
inquireOptions = new PCFMessage(CMQCFC.MQCMD_INQUIRE_CHANNEL_STATUS);
inquireOptions.addParameter(CMQCFC.MQCACH_CHANNEL_NAME, "*");
inquireOptions.addParameter(CMQCFC.MQIACH_CHANNEL_INSTANCE_TYPE, CMQC.MQOT_CURRENT_CHANNEL);
inquireOptions.addParameter(CMQCFC.MQIACH_CHANNEL_INSTANCE_ATTRS, new int[]{
CMQCFC.MQCACH_CHANNEL_NAME, CMQCFC.MQCACH_CONNECTION_NAME, CMQCFC.MQIACH_MSGS,
CMQCFC.MQCACH_LAST_MSG_DATE, CMQCFC.MQCACH_LAST_MSG_TIME, CMQCFC.MQIACH_CHANNEL_STATUS
});
responses = messageAgent.send(inquireOptions);
并非总是如此,但有时应用程序会返回一个异常,内容为“完成代码2,原因2100”,并且我的主机(运行应用程序的主机)在服务器上留下了挂起的连接,直到重新启动MQManager以后,该连接才会关闭。
我读过这个异常是由于创建动态队列时发生冲突,但是在我的代码中我没有创建任何队列。
有人可以帮我吗?抱歉,我以前没有队列管理器的经验。
谢谢
最佳答案
2100 (MQRC_OBJECT_ALREADY EXISTS)确实是创建动态队列的问题。
说明
已发出MQOPEN调用以创建动态队列,但是已经存在与该动态队列同名的队列。
完成码
MQCC_FAILED
程序员回应
如果提供完整的动态队列名称,请确保它遵循动态队列的命名约定;如果存在,请提供其他名称,或者如果不再需要,则删除现有队列。或者,允许队列管理器生成名称。
如果队列管理器正在生成名称(部分或全部),请重新发出MQOPEN调用。
在幕后,PCFMessageAgent
将使用您在PCFMessage
中提供的详细信息创建PCF格式消息,并将打开模型队列以创建临时队列,以便接收来自Command Server的答复。队列管理器通过使用时间戳生成唯一部分来命名这些临时队列,从而产生类似于AMQ.5E47207E2227AA02
的名称。如果您有许多并发应用程序在执行此操作,则可能会导致名称冲突,并且第二个请求同时进入,可能会导致名称冲突。
如果您有办法使临时队列名称更唯一(如果这种并发成为系统中的问题),则可以使用setReplyQueuePrefix方法设置用于临时队列名称的前缀。例如,您可以为每个应用程序运行时使用的用户ID(如果唯一)。
公共无效setReplyQueuePrefix(java.lang.String prefixP)
设置用作代理的答复队列名称的第一部分的字符串。 PCFAgent使用的回复队列是一个临时动态队列。默认情况下,PCFAgent使用的回复队列前缀为空字符串(“”)。使用此选项时,应答队列的名称完全由队列管理器生成。如果使用指定的前缀调用该方法,则PCFAgent会在需要创建临时队列时将其传递给队列管理器。然后,队列管理器将生成其余的临时队列名称。这意味着队列管理器会生成一个唯一的名称,但是PCFAgent仍然具有某些控制权。指定的前缀应少于33个字符。如果前缀包含33个或更多字符,则此方法将截断前缀,使其长度为32个字符。如果前缀末尾不包含星号(*)字符,则将在末尾添加星号。