c# - 仅在第一次使用 Azure Function HttpTrigger 从主题中获取消息时使用 MessageReceiver
问题描述
MessageReceiver
仅在下一次执行 Function 之后使用 Azure Function 从主题中获取消息的第一次使用,尽管我有消息仍然service bus topic
将 null 转换为 variable messages
。
使用以下代码从 Service Bus Topic 获取消息,原因是什么?
string serviceBusConnectionString = Environment.GetEnvironmentVariable("ConnectionString");
var messageReceiver = new MessageReceiver(serviceBusConnectionString, Environment.GetEnvironmentVariable("topicName/subscriptions/subscriptionName"), ReceiveMode.PeekLock, null, 500);
var messages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));
我无法理解这一点 - 每 15 分钟,当 LA 呼叫 FA 时,FA 应该能够读取新的可用消息,但它即将变为 null
有什么与锁定持续时间有关的吗?
解决方案
如果我没有理解错,您可以使用计时器触发逻辑应用程序调用该函数以获取服务总线消息,并且您总是会收到旧消息并且您不想要它。
你总是收到旧消息,因为你的 ReceiveMode 是 PeekLock,关于这个 ReceiveMode 你可以检查这个描述:Receive mode。消息后complete
,消息不会被删除,这就是为什么您总是收到旧消息的原因。
第一种方法是您可以将其更改为ReceiveAndDelete
创建时,MessageReceiver
如下面的代码。
string serviceBusConnectionString = Environment.GetEnvironmentVariable("servicebuscon");
var messageReceiver = new MessageReceiver(serviceBusConnectionString, "myqueue", ReceiveMode.ReceiveAndDelete, null, 500);
var tempMessages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));
注意:如果您的函数出现异常或其他错误并且消息没有得到完全处理,则此消息将在此模式下删除。
另一种方式是处理完消息后调用CompleteAsync方法,处理完后消息会被删除。
你可以参考下面的代码。
var messageReceiver = new MessageReceiver(serviceBusConnectionString, "myqueue", ReceiveMode.PeekLock, null, 500);
var tempMessages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));
foreach (Message m1 in tempMessages)
{
log.LogInformation($"C# HTTP trigger function processed message: {Encoding.UTF8.GetString(m1.Body)}");
await messageReceiver.CompleteAsync(m1.SystemProperties.LockToken);
}
推荐阅读
- reactjs - React 事件处理程序中“e”的任何替代方案?
- html - 如何在引导网格的中心对齐列表项,但列表项向左对齐?
- python - 没有 celery 或 kubernetes 的 Apache Airflow
- file - 以编程方式拖放文件 - VB6
- java - 哪种设计模式最适合避免方法中的多个参数
- zend-framework - ZF3 Doctrine Object 提供给 Escape 助手,但标志不允许递归
- plot - 如何在 wx.SplitterWindow(右面板)中嵌入绘图?
- yii2 - 如何正确使用 Yii2 querybuilder 插入方法?
- vim - 在备用屏幕模式下未禁用滚动
- amazon-s3 - 如果 url 参数包含 AWS s3 和 minio 不兼容签名检查;