Azure 多次接收客户机的消息,并在一个客户机收到消息后删除消息

Azure 多次接收客户机的消息,并在一个客户机收到消息后删除消息,azure,azureservicebus,azure-service-fabric,servicebus,Azure,Azureservicebus,Azure Service Fabric,Servicebus,我有两个客户正在收听topic的订阅。我看到了以下问题 问题1: 如果一个客户端收到消息并将其标记为完成,则另一个客户端将不会收到该消息 但我希望我的所有客户都能收到并确认这条消息,这样一旦客户收到这条消息,就不应该再收到了 问题2: 如果我不承认信息完整。有时我会多次收到该消息 问题3: 在消息接收过程中,如果看到网络断开连接。一段时间后,它重新连接,我收到的消息从再次开始 用于发送消息代码 ============ if (!namespaceManager.TopicExists("Dat

我有两个客户正在收听topic的订阅。我看到了以下问题

问题1:

如果一个客户端收到消息并将其标记为完成,则另一个客户端将不会收到该消息

但我希望我的所有客户都能收到并确认这条消息,这样一旦客户收到这条消息,就不应该再收到了

问题2:

如果我不承认信息完整。有时我会多次收到该消息

问题3:

在消息接收过程中,如果看到网络断开连接。一段时间后,它重新连接,我收到的消息从再次开始

用于发送消息代码

============

if (!namespaceManager.TopicExists("DataCollectionTopic"))
                    namespaceManager.CreateTopic("DataCollectionTopic");
            if (!namespaceManager.SubscriptionExists("DataCollectionTopic", "one"))
                namespaceManager.CreateSubscription("DataCollectionTopic", "one");
            for(int i=0;i<100;i++)
            {
            BrokeredMessage bm = new BrokeredMessage("new Topic one");
            bm.Label = "hELLLOOOO xcvxvxcvxvxvxc DummyMEssage"+i;
            bm.Properties["StoreName"] = "asdasdasqwedas";
            bm.Properties["MachineID"] = "Bajjiiiqweq567567wii";

            if (namespaceManager == null)
            {
                Console.WriteLine("\nUnexpected Error");
                return;
            }
            MessageSender sender = messageFactory.CreateMessageSender("DataCollectionTopic");
            sender.Send(bm);

for receiving the message

===================


MessageReceiver receiver = await messageFactory.CreateMessageReceiverAsync("DataCollectionTopic/subscriptions/Vijay");

                while (true) { 

                 BrokeredMessage receivedMessage = receiver.Receive();

                try
                {
                  ProcessMessage(receivedMessage);
                 //  receivedMessage.Complete();
                }

                catch (Exception e)
                {
                    //  receivedMessage.Abandon();
                }
                }
            }

===============
if(!namespaceManager.TopicExists(“DataCollectionTopic”))
namespaceManager.CreateTopic(“DataCollectionTopic”);
如果(!namespaceManager.SubscriptionExists(“DataCollectionTopic”,“one”))
namespaceManager.CreateSubscription(“DataCollectionTopic”、“one”);

对于(int i=0;i第1期

如果两个客户端使用相同的订阅名称接收消息,它们将充当竞争消费者。第一个接收消息并将其标记为已完成(已处理)的消费者将是赢家。其余客户端将不处理相同的消息。如果打算接收消息(事件)通过所有客户端,则每个客户端都应该有自己的订阅,并且消息的副本将传递给每个订阅

第二期

这是一种预期的行为。在收到消息之前和之后,该消息将被DLQ-ed。这是
PeekLock
模式的默认行为。使用
ReceiveAndDelete
不会发生这种情况,但这是一种危险的模式,因为如果处理不成功,您将丢失消息

第三期

这是一种预期的行为。在
PeekLock
模式下收到的每封邮件都有一个,给处理代码一个时间来完成或放弃该邮件。如果未完成,其他竞争消费者将看到该邮件,并将重新处理多达
DeliveryCount

总而言之

  • 每个客户端有多个订阅,以便所有客户端接收相同的消息(事件)
  • 如果处理成功,请完成消息。如果需要延长时间

  • 第1期

    如果两个客户端使用相同的订阅名称接收消息,它们将充当竞争消费者。第一个接收消息并将其标记为已完成(已处理)的消费者将是赢家。其余客户端将不处理相同的消息。如果打算接收消息(事件)通过所有客户端,则每个客户端都应该有自己的订阅,并且消息的副本将传递给每个订阅

    第二期

    这是一种预期的行为。在收到消息之前和之后,该消息将被DLQ-ed。这是
    PeekLock
    模式的默认行为。使用
    ReceiveAndDelete
    不会发生这种情况,但这是一种危险的模式,因为如果处理不成功,您将丢失消息

    第三期

    这是一种预期的行为。在
    PeekLock
    模式下收到的每封邮件都有一个,给处理代码一个时间来完成或放弃该邮件。如果未完成,其他竞争消费者将看到该邮件,并将重新处理多达
    DeliveryCount

    总而言之

  • 每个客户端有多个订阅,以便所有客户端接收相同的消息(事件)
  • 如果处理成功,请完成消息。如果需要延长时间

  • 问题2.如果您没有标记为已完成…最终,将出现一个超时,这将允许再次拾取该消息。我没有提到任何超时。因为我有n个客户端,它们可能会在任何时候启动,一旦启动就需要接收这些消息。但问题是,如果我重新启动我的客户端,我将再次接收到已收到的消息n、 有时我会多次收到消息,“超时”是内置的功能。我认为默认值为30秒。这取决于具体情况。请参阅“锁定持续时间”在这里,您只需要为每个接收者创建一个订阅,问题2。如果您没有标记为已完成…最终,将有一个超时,这将允许再次拾取。我没有提到任何超时。因为我有n个客户端,这些客户端可能在任何时候一启动就需要接收这些消息。但问题是,如果我重新启动启动我的客户端我再次收到已收到的消息。有时我多次收到消息“超时”是内置功能。我认为默认值为30秒。这取决于具体情况。请参阅此处的“锁定持续时间”。您只需为每个接收器创建一个订阅,