如果对象打开,则使用REPLACE
命令的DEFINE
命令失败。因此,您无法重新定义待处理事务的队列。 manual states队列中的所有消息在DEFINE
与REPLACE
期间保留,这意味着不会丢失消息完整性。您可以通过ALTER
队列中的FORCE
选项来更改当前打开的队列,如here所述。这也保留了队列中的消息而不会丢失完整性。
DEFINE
命令不会影响队列中的消息。例如,如果将队列从FIFO
更改为PRIORITY
或反之,则可能会注意到的唯一影响。这只会改变队列中新的消息的索引和排序,并且不会影响现有消息。同样,更改影响句柄的队列属性仅在下次打开队列时生效。其中的一个例子是将BIND(ONOPEN)
更改为BIND(NOTFIXED)
。
对于WMQ群集,我一直在为recommending for a while的事情之一是将队列定义分解为构建时间和运行时间属性。例如:
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),而不是因为更改导致队列,消息或事务的完整性失败。
太棒了,谢谢你的一个很好的答案。 – Synesso
您所有的MQ问题都属于我们。 :-) –