Websphere MQSC define queue命令是否会删除或损坏消息?

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 +

在WebSphereMQ6中,我想编写创建新队列的脚本。然而,队列可能已经存在,我需要脚本是幂等的

我可以使用命令创建队列。例如:

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问题都属于我们。:-)