Azure 多次接收客户机的消息,并在一个客户机收到消息后删除消息
我有两个客户正在收听topic的订阅。我看到了以下问题 问题1: 如果一个客户端收到消息并将其标记为完成,则另一个客户端将不会收到该消息 但我希望我的所有客户都能收到并确认这条消息,这样一旦客户收到这条消息,就不应该再收到了 问题2: 如果我不承认信息完整。有时我会多次收到该消息 问题3: 在消息接收过程中,如果看到网络断开连接。一段时间后,它重新连接,我收到的消息从再次开始 用于发送消息代码 ============Azure 多次接收客户机的消息,并在一个客户机收到消息后删除消息,azure,azureservicebus,azure-service-fabric,servicebus,Azure,Azureservicebus,Azure Service Fabric,Servicebus,我有两个客户正在收听topic的订阅。我看到了以下问题 问题1: 如果一个客户端收到消息并将其标记为完成,则另一个客户端将不会收到该消息 但我希望我的所有客户都能收到并确认这条消息,这样一旦客户收到这条消息,就不应该再收到了 问题2: 如果我不承认信息完整。有时我会多次收到该消息 问题3: 在消息接收过程中,如果看到网络断开连接。一段时间后,它重新连接,我收到的消息从再次开始 用于发送消息代码 ============ if (!namespaceManager.TopicExists("Dat
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秒。这取决于具体情况。请参阅此处的“锁定持续时间”。您只需为每个接收器创建一个订阅,