2015-01-24 21 views
11

Tôi đang sử dụng hàng đợi xe buýt dịch vụ của Microsoft để xử lý tính toán và chương trình của tôi chạy tốt trong vài giờ nhưng sau đó tôi bắt đầu nhận ngoại lệ này cho mọi thư mà tôi xử lý từ đó trở đi. Tôi không biết phải bắt đầu từ đâu vì mọi thứ đều ổn trong vài giờ đầu tiên. Mã của tôi dường như cũng chính xác. Tôi sẽ đăng các phương pháp mà tôi xử lý các tin nhắn dịch vụ xe buýt azure.Khóa được cung cấp không hợp lệ. Khóa đã hết hạn hoặc thư đã bị xóa khỏi hàng đợi

public static async Task processCalculations(BrokeredMessage message) 
    { 
     try 
     { 
      if (message != null) 
      { 
       if (connection == null || !connection.IsConnected) 
       { 
        connection = await ConnectionMultiplexer.ConnectAsync("connection,SyncTimeout=10000,ConnectTimeout=10000"); 
        //connection = ConnectionMultiplexer.Connect("connection,SyncTimeout=10000,ConnectTimeout=10000"); 
       } 

       cache = connection.GetDatabase(); 

       string sandpKey = message.Properties["sandp"].ToString(); 
       string dateKey = message.Properties["date"].ToString(); 
       string symbolclassKey = message.Properties["symbolclass"].ToString(); 
       string stockdataKey = message.Properties["stockdata"].ToString(); 
       string stockcomparedataKey = message.Properties["stockcomparedata"].ToString(); 

       var sandpTask = cache.GetAsync<List<StockData>>(sandpKey); 
       var dateTask = cache.GetAsync<DateTime>(dateKey); 
       var symbolinfoTask = cache.GetAsync<SymbolInfo>(symbolclassKey); 
       var stockdataTask = cache.GetAsync<List<StockData>>(stockdataKey); 
       var stockcomparedataTask = cache.GetAsync<List<StockMarketCompare>>(stockcomparedataKey); 

       await Task.WhenAll(sandpTask, dateTask, symbolinfoTask, 
        stockdataTask, stockcomparedataTask); 

       List<StockData> sandp = sandpTask.Result; 
       DateTime date = dateTask.Result; 
       SymbolInfo symbolinfo = symbolinfoTask.Result; 
       List<StockData> stockdata = stockdataTask.Result; 
       List<StockMarketCompare> stockcomparedata = stockcomparedataTask.Result; 

       StockRating rating = performCalculations(symbolinfo, date, sandp, stockdata, stockcomparedata); 

       if (rating != null) 
       { 
        saveToTable(rating); 
        if (message.LockedUntilUtc.Minute <= 1) 
        { 
         await message.RenewLockAsync(); 
        } 
        await message.CompleteAsync(); // getting exception here 
       } 
       else 
       { 
        Console.WriteLine("Message " + message.MessageId + " Completed!"); 
        await message.CompleteAsync(); 
       } 
      } 
     } 
     catch (TimeoutException time) 
     { 
      Console.WriteLine(time.Message); 
     } 
     catch (MessageLockLostException locks) 
     { 
      Console.WriteLine(locks.Message); 
     } 
     catch (RedisConnectionException redis) 
     { 
      Console.WriteLine("Start the redis server service!"); 
     } 
     catch (MessagingCommunicationException communication) 
     { 
      Console.WriteLine(communication.Message); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      Console.WriteLine(ex.StackTrace); 
     } 
    } 

CẬP NHẬT: Tôi kiểm tra thời gian cho đến khi hết hạn khóa và tôi gia hạn khóa không có lỗi nhưng tôi vẫn nhận được ngoại lệ này.

timeLeft = message.LockedUntilUtc - DateTime.UtcNow; 
    if (timeLeft.TotalMinutes <= 2) 
        { 
         //Console.WriteLine("Renewed lock! " + ((TimeSpan)(message.LockedUntilUtc - DateTime.UtcNow)).TotalMinutes); 
         message.RenewLock(); 
        } 

catch (MessageLockLostException locks) 
     { 
      Console.WriteLine("Delivery Count: " + message.DeliveryCount); 
      Console.WriteLine("Enqueued Time: " + message.EnqueuedTimeUtc); 
      Console.WriteLine("Expires Time: " + message.ExpiresAtUtc); 
      Console.WriteLine("Locked Until Time: " + message.LockedUntilUtc); 
      Console.WriteLine("Scheduled Enqueue Time: " + message.ScheduledEnqueueTimeUtc); 
      Console.WriteLine("Current Time: " + DateTime.UtcNow); 
      Console.WriteLine("Time Left: " + timeLeft); 
     } 

Tất cả tôi biết cho đến nay là mã của tôi chạy tốt cho một lúc và khóa mới được gọi và các công trình nhưng tôi vẫn nhận được ngoại trừ khóa và bên trong ngoại lệ đó, tôi đầu ra các timeleft và nó tiếp tục tăng sự khác biệt thời gian như mã chạy mà làm cho tôi tin rằng thời gian cho đến khi hết hạn khóa không được thay đổi bằng cách nào đó?

+1

Bạn đã bao giờ giải quyết vấn đề này chưa? Nó là cái gì vậy? –

+1

@FyodorSoikin Không cuối cùng tôi đã phải từ bỏ và làm việc trên một phương pháp khác để làm điều tương tự. Từ những gì tôi có thể nói, đó là lỗi trong api nhưng không ai từ Microsoft trả lời bài viết của tôi – user3610374

+0

Bất kỳ cơ hội nào của bạn có thể mất hơn 60 giây để xử lý? – DalSoft

Trả lời

4

Tôi đã mất nhiều giờ cố gắng hiểu tại sao tôi đã nhận được một MessageLockLostException. Lý do của tôi là do AutoComplete mặc định là true.

Nếu bạn đang đi để gọi messsage.Complete() (hoặc CompleteAsync()) thì bạn nên tạo một đối tượng OnMessageOptions, thiết AutoComplete false, và vượt qua nó vào OnMessage cuộc gọi của bạn.

var options = new OnMessageOptions(); 
options.AutoComplete = false; 

client.OnMessage(processCalculations, options); 
0

Thay vì đổi mới manualy khóa, khi bạn tạo các thuê bao của khách hàng, hãy thử tự động làm mới nó bằng cách sử OnMessageOptions của khách hàng() như thế này:

 OnMessageOptions options = new OnMessageOptions(); 

     options.AutoRenewTimeout = TimeSpan.FromMinutes(1); 

     try 
     { 
      client = Subscription.CreateClient(); 

      client.OnMessageAsync(MessageReceivedComplete, options); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception (ex); 
     } 
+0

Phiên bản ServiceBus nào bạn đang sử dụng? Phiên bản tôi có là v2.2.0.0 và không có một thuộc tính gọi AutoRenewTimeout trong lớp OnMessageOptions – Rogala

+0

Hi Rogala. Tôi đang sử dụng phiên bản 2.7.0.0. –

1

Tôi gặp sự cố tương tự. Tin nhắn đã được xử lý thành công, nhưng khi họ hoàn tất, Service Bus không còn khóa hợp lệ nữa. Hóa ra TopicClient.PrefetchCount của tôi quá cao.

Dường như khóa bắt đầu trên tất cả các thư được tìm nạp trước khi chúng được tìm nạp. Nếu thời gian xử lý tin nhắn tích lũy của bạn vượt quá thời gian chờ khóa, mọi thông báo được tìm nạp trước khác sẽ không hoàn thành. Nó sẽ trở lại xe buýt dịch vụ.

Các vấn đề liên quan