使用Azure Service Bus订阅OnMessageAsync事件时出错

时间:2015-05-15 21:18:08

标签: c# azure servicebus

我们在项目中使用Azure Service Bus,同时从服务总线主题/订阅中读取消息。 我们将subscriptionClient.OnMessageAsync事件与onMessageOptions.ExceptionReceived结合使用。 让我写下我们为重现我们面临的问题而采取的步骤。

  1. 使用azure portal
  2. 中的默认配置创建服务总线命名空间
  3. 使用azure portal
  4. 中的默认配置在其中创建主题
  5. 使用azure portal
  6. 中的默认配置在其中创建订阅
  7. 创建一个控制台应用并粘贴下面添加的代码
  8. 使用Service Bus Explorer
  9. 连接服务总线
  10. 运行控制台应用
  11. 从服务总线资源管理器发送一些测试消息&观看控制台应用程序窗口
  12. 虽然每次控件进入ExceptionReceived方法
  13. 时都会成功处理消息

    以下是代码:

    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!");
        }
    }
    

    Error

    我们在这里遗漏了什么吗?

    还有一点需要注意的是,我们启用了'自动填充'并删除了await arg.CompleteAsync();,然后才发生这种情况。

    var onMessageOptions = new OnMessageOptions() { AutoComplete = true};
    

    在这两种情况下,消息都得到了成功处理。立即从订阅中删除。

1 个答案:

答案 0 :(得分:0)

你可能会得到这个,因为你正在调试并踩过代码,即锁定到期。默认情况下,LockDuration为60秒。

您可以尝试像这样设置OnMessageOptions()来测试:

var onMessageOptions = new OnMessageOptions() { AutoRenewTimeout = TimeSpan.FromMinutes(1) };