我们在项目中使用Azure Service Bus,同时从服务总线主题/订阅中读取消息。
我们将subscriptionClient.OnMessageAsync
事件与onMessageOptions.ExceptionReceived
结合使用。
让我写下我们为重现我们面临的问题而采取的步骤。
ExceptionReceived
方法以下是代码:
class Program
{
static void Main()
{
var subscriptionClient = SubscriptionClient.CreateFromConnectionString
(
"servicebusendpointaddress",
"topicname",
"subscriptionname",
ReceiveMode.PeekLock
);
var onMessageOptions = new OnMessageOptions();
onMessageOptions.ExceptionReceived += OnMessageError;
subscriptionClient.OnMessageAsync(OnMessageReceived, onMessageOptions);
Console.ReadKey();
}
private static void OnMessageError(object sender, ExceptionReceivedEventArgs e)
{
if (e != null && e.Exception != null)
{
Console.WriteLine("Hey, there's an error!" + e.Exception.Message + "\r\n\r\n");
}
}
private static async Task OnMessageReceived(BrokeredMessage arg)
{
await arg.CompleteAsync();
Console.WriteLine("Message processing done!");
}
}
我们在这里遗漏了什么吗?
还有一点需要注意的是,我们启用了'自动填充'并删除了await arg.CompleteAsync();
,然后才发生这种情况。
var onMessageOptions = new OnMessageOptions() { AutoComplete = true};
在这两种情况下,消息都得到了成功处理。立即从订阅中删除。
答案 0 :(得分:0)
你可能会得到这个,因为你正在调试并踩过代码,即锁定到期。默认情况下,LockDuration为60秒。
您可以尝试像这样设置OnMessageOptions()来测试:
var onMessageOptions = new OnMessageOptions() { AutoRenewTimeout = TimeSpan.FromMinutes(1) };