如何使用PCF命令在Qmanager上强制删除队列

时间:2018-09-17 18:05:52

标签: ibm-mq series pcf

当前,我使用PCF命令通过

删除QMANAGER上的队列。
PCFMessage message = new PCFMessage( CMQCFC.MQCMD_DELETE_Q );
message.addParameter( CMQC.MQCA_Q_NAME, name);
agent.send( message );

如果队列被占用,是否可以强制删除?


我在QL上尝试不成功

@Override
protected PCFMessage getRequestRemove(String objetName,
        String qmanagerName,boolean forceQmanager) {
    PCFMessage request = new PCFMessage(CMQCFC.MQCMD_DELETE_Q);
        request.addParameter( CMQCFC.MQIACF_PURGE, CMQCFC.MQPO_YES );     

    request.addParameter(CMQC.MQCA_Q_NAME, objetName);
    request.addParameter(CMQC.MQIA_Q_TYPE, CMQC.MQQT_LOCAL);
    return request;
}

错误代码由以下原因引起:com.ibm.mq.pcf.PCFException:MQJE001:代码实现为“ 2”,母题为“ 3014”。 我的PCF库是7.1.0.4

致谢

2 个答案:

答案 0 :(得分:3)

DELETE队列命令上没有FORCE选项。如果队列当前正在由应用程序打开以供输入,并且它们正在MQGET中等待,则可以使用以下命令将其踢出。

MQSC

ALTER QLOCAL(q-name) GET(DISABLED)

PCF

PCFMessage message = new PCFMessage (CMQCFC.MQCMD_CHANGE_Q);
message.addParameter(CMQC.MQCA_Q_NAME, name);
message.addParameter(CMQC.MQIA_INHIBIT_GET, CMQC.MQQA_GET_INHIBITED);
agent.send(message);

但是,如果队列当前处于打开状态,并且应用程序当前不在MQGET或MQPUT中,那么您将无法以这种方式将其踢出,那么,唯一的选择就是使用{{1}查找有问题的应用程序},然后发出DISPLAY CONN让他们释放队列。

最可能占用队列的是较长的MQGET-waiter,因此上述示例命令将在大多数情况下有所帮助。

答案 1 :(得分:0)

Morag的答案解决了断开当前打开队列的进程的可能方法,如果您还想在消息处于队列中时删除队列,则需要让MQ清除消息:

PCFMessage message = new PCFMessage( CMQCFC.MQCMD_DELETE_Q );
message.addParameter( CMQC.MQCA_Q_NAME, name);
message.addParameter( CMQCFC.MQIACF_PURGE, CMQCFC.MQPO_YES );
agent.send( message );