Websphere MQSC define queue命令是否会删除或损坏消息?
在WebSphereMQ6中,我想编写创建新队列的脚本。然而,队列可能已经存在,我需要脚本是幂等的 我可以使用命令创建队列。例如:Websphere MQSC define queue命令是否会删除或损坏消息?,websphere,message-queue,ibm-mq,Websphere,Message Queue,Ibm Mq,在WebSphereMQ6中,我想编写创建新队列的脚本。然而,队列可能已经存在,我需要脚本是幂等的 我可以使用命令创建队列。例如: DEFINE QREMOTE(%s) RNAME(%s) RQMNAME(%s) XMITQ(%s) DEFPSIST(YES) REPLACE DEFINE QLOCAL (APP.FUNCTION.SUBFUNCTION.QA) + GET(DISABLED) + PUT(DISABLED) + NOTRIGGER +
DEFINE QREMOTE(%s) RNAME(%s) RQMNAME(%s) XMITQ(%s) DEFPSIST(YES) REPLACE
DEFINE QLOCAL (APP.FUNCTION.SUBFUNCTION.QA) +
GET(DISABLED) +
PUT(DISABLED) +
NOTRIGGER +
NOREPLACE
ALTER QLOCAL (APP.FUNCTION.SUBFUNCTION.QA) +
DESCR('APP service queue for QA') +
DEFPSIST(NO) +
BOTHRESH(5) +
BOQNAME('APP.FUNCTION.BACKOUT.QA') +
CLUSTER('DIV_QA') +
CLUSNL(' ') +
DEFBIND(NOTFIXED)
或
REPLACE
关键字确保在队列已经存在的情况下创建不会失败
我已经用一个现有的非空队列对此进行了测试,似乎没有消息丢失。然而,这还不够证明。我需要确定,如果我运行defineq。。。对现有队列替换
命令。现有队列当时甚至可能正在参与事务
有人能确认或否认这种行为吗?如果对象打开,则带有
REPLACE
的DEFINE
命令将失败。因此,您不能重新定义具有挂起事务的队列。使用REPLACE
在DEFINE
过程中保留队列中的所有消息,这意味着不会丢失消息完整性。您可以使用FORCE
选项ALTER
更改当前打开的队列,如前所述。这也会在不丢失完整性的情况下保留队列中的消息
DEFINE
命令不会影响队列中的消息。您可能注意到的唯一影响是,例如,如果您将队列从FIFO
更改为PRIORITY
,反之亦然。这只会更改队列中新消息的索引和排序,不会影响现有消息。类似地,更改影响句柄的队列属性仅在下次打开队列时生效。例如,将BIND(ONOPEN)
更改为BIND(NOTFIXED)
我为WMQ集群所做的一件事是将队列定义拆分为构建时和运行时属性。例如:
DEFINE QREMOTE(%s) RNAME(%s) RQMNAME(%s) XMITQ(%s) DEFPSIST(YES) REPLACE
DEFINE QLOCAL (APP.FUNCTION.SUBFUNCTION.QA) +
GET(DISABLED) +
PUT(DISABLED) +
NOTRIGGER +
NOREPLACE
ALTER QLOCAL (APP.FUNCTION.SUBFUNCTION.QA) +
DESCR('APP service queue for QA') +
DEFPSIST(NO) +
BOTHRESH(5) +
BOQNAME('APP.FUNCTION.BACKOUT.QA') +
CLUSTER('DIV_QA') +
CLUSNL(' ') +
DEFBIND(NOTFIXED)
在这种情况下,GET
、PUT
和TRIGGER
属性被视为运行时属性,仅在首次定义队列时设置。这允许您在群集中定义一个新队列,并将其禁用,直到您准备好打开应用程序为止。在脚本的后续运行中,这些属性从未更改,因为语句使用了NOREPLACE
。因此,一旦您在队列上启用了GET
和PUT
,这些属性(以及应用程序的功能)就不会受到后续脚本运行的干扰
然后,ALTER
处理所有被认为是构建时的属性。例如,如果更改描述,则希望在下一次脚本运行中拾取它。因为我们在上一步中定义了队列(或者该步骤由于队列存在而失败),所以我们知道ALTER将起作用
任何属性(如集群成员资格)是构建时还是运行时都由您决定。这只是一个例子,在许多情况下,管理员通过重新运行MQSC脚本无意中破坏了某些东西
但为了回答您的问题,有人重置了运行时属性,例如
GET(DISABLED)
(如果应用程序在禁用GET后尝试在该队列上执行GET,则可能会导致正在进行的事务退出)并不是因为更改导致队列、消息或事务的完整性失败。您的所有MQ问题都属于我们。:-)