我正在使用IBM WebSphere MQ设置Pub / Sub的持久预订。我正在使用他们的C API。我已经设置了订阅名称,并且在选项中输入了MQSO_RESUME

当我为订户设置等待间隔并正确关闭订户时,它可以正常工作并重新启动。

但是,如果我强制使订户崩溃(Ctrl-C)并尝试重新打开它,则会得到MQSUB ended with reason code 2429,它是MQRC_SUBSCRIPTION_IN_USE.

我在MQWI_UNLIMITED中使用WaitInterval作为我的MQGET,并使用MQGMO_WAIT | MQGMO_NO_SYNCPOINT | MQGMO_CONVERT作为我的MQGET选项

仅当主题没有该订阅的待处理消息时,才会弹出此错误。如果它有待订阅的邮件可以恢复的待处理消息,那么它将恢复并且它将忽略该主题中的第一条已发布消息。

我尝试将心跳间隔更改为2秒,但并没有解决。

我该如何预防?

最佳答案

发生这种情况是因为队列管理器尚未检测到您的应用程序已失去与队列管理器的连接。您可以通过发出以下MQSC命令来看到这一点:

DISPLAY CONN(*) TYPE(ALL) ALL WHERE(APPLTYPE EQ USER)


并且您将看到您的应用程序仍列为已连接。一旦队列管理器注意到您的进程已结束,您将能够再次恢复订阅。您没有说您的连接是本地绑定连接还是客户端连接,但是根据连接类型,有一些技巧可以帮助加快检测连接的速度。

您说在能够恢复的时间内您没有收到第一条消息,这是因为您正在使用MQGMO_NO_SYNCPOINT检索此消息,因此您没有收到的消息已从队列中删除并一直在打开当您强行将其崩溃时,它就会从套接字下降到客户端应用程序,因此该消息消失了。如果使用MQGMO_SYNCPOINT(和MQCMIT),则不会出现该问题。

您说当队列上仍有消息要处理时,您看不到问题,仅当队列为空时,您才看到问题。我怀疑这里的区别是您的应用程序是在MQGET等待中还是在您强制将其崩溃时正在处理消息。显然,当队列中没有剩余消息时,可以保证使用MQWL_UNLIMITED处于MQGET-等待状态,但是在处理消息时,您可能花费比MQGET更多的时间在里面。

您提到调低心跳间隔,以尝试减少时间范围,这是一个好主意。你说那没用请记住,您必须在频道的两端进行更改,否则您仍将使用默认的5分钟。

关于c - MQSUB在pub sub中以原因代码2429结尾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27788437/

10-11 19:38