2011-12-06 65 views
2

在WebSphere MQ 6中,我想脚本创建新的队列。然而队列可能已经存在,我需要脚本是幂等的。MQSC会定义队列命令是否删除或损坏消息?

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

DEFINE QREMOTE(%s) RNAME(%s) RQMNAME(%s) XMITQ(%s) DEFPSIST(YES) REPLACE 

DEFINE QLOCAL(%s) DESCR(%s) DEFPSIST(YES) REPLACE 

REPLACE关键字确保如果队列已经存在的创建不会失败。

我已经测试了这个与现有的非空队列,似乎没有消息丢失。然而,这不足以证明。我需要确定,如果我针对现有队列运行DEFINE Q... REPLACE命令,则不会丢失或损坏任何消息。现有的队列甚至可能在当时参与交易。

任何人都可以确认或否认这种行为?

回答

2

如果对象打开,则使用REPLACE命令的DEFINE命令失败。因此,您无法重新定义待处理事务的队列。 manual states队列中的所有消息在DEFINEREPLACE期间保留,这意味着不会丢失消息完整性。您可以通过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) 

在这种情况下GETPUTTRIGGER和属性被认为是运行时间,并且仅当第一次定义的一组队列。这允许您在集群中定义一个新队列,并在您准备打开应用程序之前禁用它。在脚本的后续运行中,这些属性从未更改,因为该语句使用NOREPLACE。因此,一旦在队列上启用GETPUT,这些属性(以及应用程序的功能)就不会受后续脚本运行的干扰。

ALTER然后处理所有属于构建时间的属性。例如,如果您更改说明,则希望在下一次脚本运行中找到它。因为我们在上一步中定义了队列(或者因为队列存在而导致该步骤失败),所以我们知道ALTER会起作用。

是否有任何属性(如群集成员资格)是构建时间还是运行时间由您决定。这只是许多情况下出现的例子,管理员通过重新运行MQSC脚本而无意中破坏了某些内容。

但是,为了回答你的问题多一点的点,即打破了东西,因为有人重置运行时间属性,如GET(DISABLED)(这可能会导致被回退在飞行中的事务,如果应用程序试图在获取被禁用后在该队列上执行GET),而不是因为更改导致队列,消息或事务的完整性失败。

+0

太棒了,谢谢你的一个很好的答案。 – Synesso

+0

您所有的MQ问题都属于我们。 :-) –