2015-01-24 9 views
11

से हटा दिया गया है, मैं गणना प्रक्रिया को संसाधित करने के लिए एक Microsoft Azure सेवा बस कतार का उपयोग कर रहा हूं और मेरा प्रोग्राम कुछ घंटों के लिए ठीक चलाता है लेकिन फिर मुझे प्रत्येक संदेश के लिए यह अपवाद प्राप्त करना शुरू होता है कि मैं तब से प्रक्रिया करता हूं। मेरे पास कोई सुराग नहीं है जहां से शुरू करना है क्योंकि सबकुछ पहले कुछ घंटों के लिए ठीक है। मेरा कोड भी सटीक प्रतीत होता है। मैं उस विधि को पोस्ट करूंगा जहां मैं एज़ूर सेवा बस संदेश को संभालता हूं।आपूर्ति की गई लॉक अमान्य है। या तो लॉक समाप्त हो गया है, या संदेश को पहले से ही कतार

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

अद्यतन: मैं ताला समाप्ति तक समय की जाँच करें और मैं फोन करता है, तो यह है कि यह जरूरत है, लेकिन यह कोई त्रुटि के साथ ताला नवीनिकृत लेकिन मैं अभी भी यह अपवाद हो रही है नवीनीकृत ताला।

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

सभी मैं अब तक जानता हूँ कि मेरे कोड कुछ समय के लिए ठीक चलाता है और नवीनीकृत ताला कहा जाता हो जाता है और काम करता है लेकिन मैं अभी भी ताला अपवाद हो रही है और कहा कि अपवाद के अंदर, मैं उत्पादन timeleft है और यह बढ़ती रहती है कोड अंतर के रूप में समय अंतर जो मुझे विश्वास दिलाता है कि समय तक लॉक समाप्ति को किसी भी तरह बदला नहीं जा रहा है?

+1

क्या आपने कभी इसे हल किया है? यह क्या था? –

+1

@FyodorSoikin नहीं, मुझे अंततः एक ही काम करने के लिए एक अलग विधि को छोड़ना और काम करना पड़ा। जो मैं बता सकता हूं, यह एपीआई में एक बग है लेकिन माइक्रोसॉफ्ट के किसी ने कभी भी मेरी पोस्ट का जवाब नहीं दिया – user3610374

+0

किसी भी मौके से आपके व्यक्तिगत संदेशों में से कोई भी प्रक्रिया 60 सेकंड से अधिक समय तक ले सकता है? – DalSoft

उत्तर

4

मैं घंटे बिताए क्यों मैं एक MessageLockLostException हो रही थी की कोशिश कर रहा। मेरे लिए कारण AutoComplete सत्य के लिए डिफ़ॉल्ट था।

आप messsage.Complete() (या CompleteAsync()) कॉल करने के लिए तो आप एक OnMessageOptions वस्तु का दृष्टांत चाहिए जा रहे हैं, गलत पर AutoComplete निर्धारित करते हैं, और यह अपने OnMessage कॉल में गुजरती हैं।

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

client.OnMessage(processCalculations, options); 
0

इसके बजाय ताला manualy नवीकरण, जब आप ग्राहक सदस्यता बनाने, ऑटो इस तरह ग्राहक की OnMessageOptions() का उपयोग कर इसे के नवीकरण का प्रयास करें:

 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

सेवाबस का किस संस्करण का उपयोग कर रहे हैं? मेरे पास संस्करण v2.2.0.0 है और ऑन मैसेजऑप्शन क्लास – Rogala

+0

हाय रोगला में ऑटोरन्यूटाइमआउट प्रॉपर्टी कॉल नहीं है। मैं संस्करण 2.7.0.0 का उपयोग कर रहा था। –

1

मुझे एक समान समस्या थी। संदेशों को सफलतापूर्वक संभाला जा रहा था, लेकिन जब वे पूरा करने के लिए गए, तो सर्विस बस के पास अब वैध लॉक नहीं था। यह मेरा TopicClient.PrefetchCount बहुत अधिक था।

ऐसा लगता है कि लॉक सभी प्रीफेच किए गए संदेशों पर जैसे ही उन्हें लाया जाता है, शुरू होता है। यदि आपका संचयी संदेश प्रसंस्करण समय लॉक टाइमआउट को पार करता है तो हर दूसरे प्रीफेच किए गए संदेश को पूरा करने में विफल रहेगा। यह सेवा बस में वापस आ जाएगा।

संबंधित मुद्दे

 संबंधित मुद्दे