Java 在使用基于拉的方式检索消息时,两个使用者能否获得相同的消息集?

Java 在使用基于拉的方式检索消息时,两个使用者能否获得相同的消息集?,java,rabbitmq,messaging,Java,Rabbitmq,Messaging,因此,我有一个基于单客户端服务器的生态系统,在这个生态系统中,我使用RabbitMQ作为持久中间件 现在,单个消息的流是这样的 步骤1:客户端A向服务器发送带有目标的消息 在该消息的元数据中设置为客户端B 步骤2:服务器在收到消息后将消息推送到 RabbitMQ并向客户端B发送一个通知,告知他有一些消息 去拿 步骤3:客户机B在收到通知后调用获取消息API 从服务器获取消息 步骤4:在服务器上,从客户端B调用后 使用基于拉的方法从RabbitMQ发送消息 (channel.basicGet(q

因此,我有一个基于单客户端服务器的生态系统,在这个生态系统中,我使用RabbitMQ作为持久中间件

现在,单个消息的流是这样的

  • 步骤1:客户端A向服务器发送带有目标的消息 在该消息的元数据中设置为客户端B
  • 步骤2:服务器在收到消息后将消息推送到 RabbitMQ并向客户端B发送一个通知,告知他有一些消息 去拿
  • 步骤3:客户机B在收到通知后调用获取消息API 从服务器获取消息
  • 步骤4:在服务器上,从客户端B调用后 使用基于拉的方法从RabbitMQ发送消息 (
    channel.basicGet(queueName,false)
    )并交出 信息
现在在上面的流程中,我对一些事情有些怀疑

首先,如果我的客户机收到两个通知并两次调用拉消息API,那么可能会出现并发问题

假设我在获取消息时没有发送消息确认,但在之后发送,那么是否可能将同一消息发送到两个pull API?如果是这样的话,有没有办法防止这种情况发生

从MQ获取消息的示例代码:

    long currentMessageCount = channel.messageCount(QUEUE_NAME);
    while (currentMessageCount-- > 0) {
        GetResponse getResponse = channel.basicGet(QUEUE_NAME, false);
        if (getResponse == null) {
            break;
        }
        AMQP.BasicProperties props        = getResponse.getProps();
        Envelope             envelope     = getResponse.getEnvelope();
        int                  messageCount = getResponse.getMessageCount();
        byte[]               body         = getResponse.getBody();
        /*
            Do some logic
         */
        channel.basicAck(envelope.getDeliveryTag(), false);
    }

TIA

basicGet
很少是正确的解决方案。在步骤2中,客户端应该使用RabbitMQ。无需通知消息已准备就绪。RabbitMQ将在消息进入队列后立即将其发送到客户端B。步骤3和步骤4变得不必要



注意:RabbitMQ团队监视并有时只回答有关StackOverflow的问题。

我有一个消息传递应用程序。。从服务器获取通知的。。然后它从服务器上拉过来。。。除了基于拉的机制,我别无选择。。否则我应该使用基于推的机制。“除了基于拉的机制之外,我别无选择”——根据你的描述,我不同意。