有没有一种方法可以轻松地从ServiceBus订阅中接收C#当前的消息?

时间:2020-01-15 23:34:52

标签: c# azureservicebus

看着documentation,似乎没有一种方法可以简单地阅读并处理它们。

我的问题是我希望程序或任务检查队列并处理一些消息,并且我不希望该程序或任务存在比清空消息订阅的时间更长。

以下是示例代码:

// Register subscription message handler and receive messages in a loop
RegisterOnMessageHandlerAndReceiveMessages();
Console.ReadKey();
await subscriptionClient.CloseAsync();

我要做的是将Console.ReadKey();替换为在队列为空时将继续出现的内容。但是,设置类的方式是必须设置一个错误处理程序和一个消息处理程序,然后在发生事件之前,它将基本上调用您的处理程序,直到您告诉它停止为止。我看不到任何消息,可以在没有消息时让您知道。

2 个答案:

答案 0 :(得分:1)

我的问题是我希望程序或任务检查队列并处理一些消息,并且我不希望该程序或任务存在比清空消息订阅的时间更长。

消息处理程序构造不适用于您描述的场景。它用于连续的消息流。对于您而言,消息并非始终可用,并且您希望在消息可用时对其进行响应。有两种方法可以通过被动方法来解决它。

  1. 天蓝色函数。使用Azure Functions,仍然有一种运行24/7的轮询机制,但是您不必拥有它,也不需要运行它。从函数的角度来看,只要有消息,就会调用代码。
  2. 事件网格触发了处理。当消息可用于处理且未连接使用者时,可以使用事件网格来触发事件。这样,您可以使用任何选项而不只是Azure Functions触发处理。处理完消息后,该过程可以退出,直到出现更多消息,并且Event Grid再次发出通知事件。请注意,此选项仅适用于Azure Service Bus premium。

答案 1 :(得分:0)

我在示例存储库中找到了一个名为MessageReceiver的类,它提供了我所需的功能。

string subscriptionEntityPath = "my-topic/subscriptions/my-subscription";
MessageReceiver receiver = new MessageReceiver(
    serviceBusConnectionString,
    subscriptionEntityPath,
    ReceiveMode.PeekLock);
var message = await receiver.ReceiveAsync(TimeSpan.FromSeconds(5));
while (message != null)
{
    // handle message

    message = await receiver.ReceiveAsync(TimeSpan.FromSeconds(5));
}
await receiver.CloseAsync();