2

我的问题是关于在 IBM MQ 中使用单个队列的一对多消息流。我是 MQ 的新手。

场景 - 假设有多个进程从单个队列中读取,当它们从队列中读取消息时,它们是否都得到相同的消息。

ie - 可以说队列上没有消息,并且两个阅读器被阻止(在其上执行 MQGET)。

  1. 1 条消息进入队列(逻辑上用于进程 1)。他们是否都会在等待(在其上执行 MQGET)或仅随机到一个进程时收到消息。

  2. 一旦消息被读取,它就会从队列中删除。

  3. 如果消息在读取后从队列中删除,则假设进程 1 正在处理并且有一条新消息为它而来,而进程 2 得到它并被删除。当进程 1 尝试获取时,它不会收到任何消息。这可能吗。

基本上我想知道如何在单个队列上管理多个进程,以便消息进入正确的进程并且不会丢失任何消息。

4

1 回答 1

2

如果不使用选择器,则多个应用程序在队列上读取消息会竞争消息。直接 FIFO 读取将消息传递给竞争的应用程序,这样任何一条消息都会被传递给一个应用程序实例。假设应用程序在同步点之外获取消息或发出COMMIT然后没有其他应用程序将看到该消息,它将被永久删除。

改变行为的事情包括:

  • 消息选择器。如果应用程序通过MsgID或其他选择标准获取消息,则 QMgr 仅将满足选择的消息提供给应用程序。如果多个应用程序实例使用相同的选择标准,它们会在选择器定义的子集中竞争消息。
  • 回滚。如果一个应用程序回滚一条消息,它会再次可用,并且可能会转到相同或不同的应用程序实例。
  • 优先发货。行为与 FIFO 相同,只是消息按优先级排序,优先级最高的消息首先传递。
  • 消息组。可以按组 ID 选择消息,并指定 GET 在组中的所有消息都存在之前不会成功。如果部分组位于队列上,则可以看到队列的深度,但没有消息传递到应用程序。

一次一个地看你的问题:

  1. 消息进入队列(逻辑上用于进程 1)。他们是否都会在等待(在其上执行 MQGET)或仅随机到一个进程时收到消息。
    排队很便宜。如果应用正在读取 FIFO,则不要将发往 App1 和 App2 的消息放在同一个队列中。跨不同应用程序(或同一应用程序的不同实例)共享队列的唯一方法是,如果从队列中读取的所有内容都使用选择器,并且选择器有效地隔离消息,以便它们进入正确的应用程序。如果甚至一个实例正在运行 FIFO,那么它就不起作用。

  2. 一旦消息被读取,它就会从队列中删除。
    是的,只要应用程序发出一个GET同步点COMMITGET同步点之外的问题。如果应用程序浏览队列,则消息会保留下来,一旦浏览光标移开,其他应用程序就可以使用该消息。

  3. 如果消息在读取后从队列中删除,则假设进程 1 正在处理并且有一条新消息为它而来,而进程 2 得到它并被删除。当进程 1 尝试获取时,它不会收到任何消息。这可能吗。
    绝对地。如前所述,以 FIFO 模式读取队列的应用程序或应用程序实例将竞争消息。如果确实有消息到达“进程 1”,则要么使用阻止其他进程读取消息的选择器,要么为每个实例使用不同的队列。

于 2012-10-10T20:21:44.650 回答