【发布时间】:2021-12-29 19:44:05
【问题描述】:
我正在开发一个控制台应用程序,该程序从 Azure IoT 设备接收消息,并使用计时器每两秒接收一次消息。收到消息后,设备会发出呼叫以完成消息。我遇到的问题是,在设备再次收到消息之前,消息在 Azure 中没有完成,这导致消息被重新处理。我试图过滤传入的消息,当它是多次传入的相同消息时,但无论它们是重复消息还是新消息,这些消息都以相同的消息 ID 传入。我无权控制传入消息的消息 id 字段并使其唯一,但这可以解决问题。序列号对于传入的每条消息都是唯一的,无论它是否重复,因此我也不能将其用作过滤器。有没有办法在没有消息 id 字段的情况下过滤消息以查看它是否是重复的?
//Within Program.cs > Main():
_timer = new Timer(Operations, null, 0, _timerInterval); //_timerInterval is set to 2000
//Within Initialize class used to setup device client:
//Fully qualified namespace for DeviceClient:
//Microsoft.Azure.Devices.Client.DeviceClient
string connectionString = "code removed for example";
var deviceClient = DeviceClient.CreateFromConnectionString(connectionString);
//Within Operations class:
var message = await deviceClient.ReceiveAsync();
if (message != null && !string.IsNullOrEmpty(message?.MessageId))
{
//Filtering message based on MessageId
if (_memoryCache.Get(message.MessageId) == null)
{
_memoryCache.Set(message.MessageId, message.MessageId, DateTimeOffset.UtcNow.AddMinutes(10));
await deviceClient.CompleteAsync(message);
//Processing message
await ProcessMessage(message);
}
else
{
await deviceClient.RejectAsync(message);
}
}
【问题讨论】:
-
您能否澄清一下,这个物联网设备是您开发的,还是现成的产品?物联网设备应负责在每条消息上显式设置唯一 ID,以便您可以处理此类场景。您是否设置了断点并查看了运行时提供的所有属性?它可以在
message.Properties字典中以自定义名称提供 -
您好 Andrew,这是一个 Microsoft Azure IoT Hub 设备。看起来可以设置消息 ID,但由于消息不是来自该程序,因此我无法在此处设置并使其唯一。我设置了一个断点,并尝试过滤任何内置消息属性以及 Message.Properties 字典,但在这两个地方都没有任何东西可以作为唯一标识符。
-
@Developer 您认为什么是重复消息?你怎么知道一条消息是重复的?
-
重复消息是指具有与另一条相同的消息 ID、属性和内容的消息。我遇到的问题是不同的消息(不是重复的)可以具有与其他消息相同的内容、属性和消息 ID,从而消除了任何会使它们变得独特的东西。
标签: c# filter async-await message azure-iot-hub