Implements lock semantics on AzureDirectory via a blob lease
Inheritance: Lock
示例#1
0
        public override bool Obtain()
        {
            var blob = _azureDirectory.BlobContainer.GetBlockBlobReference(_lockFile);

            try
            {
                Debug.Print("AzureLock:Obtain({0}) : {1}", _lockFile, _leaseid);
                if (String.IsNullOrEmpty(_leaseid))
                {
                    _leaseid = blob.AcquireLease(TimeSpan.FromSeconds(60), _leaseid);
                    Debug.Print("AzureLock:Obtain({0}): AcquireLease : {1}", _lockFile, _leaseid);

                    // keep the lease alive by renewing every 30 seconds
                    long interval = (long)TimeSpan.FromSeconds(30).TotalMilliseconds;
                    _renewTimer = new Timer((obj) =>
                    {
                        try
                        {
                            AzureLock al = (AzureLock)obj;
                            al.Renew();
                        }
                        catch (Exception err) { Debug.Print(err.ToString()); }
                    }, this, interval, interval);
                }
                return(!String.IsNullOrEmpty(_leaseid));
            }
            catch (StorageException webErr)
            {
                if (_handleWebException(blob, webErr))
                {
                    return(Obtain());
                }
            }
            return(false);
        }
        public override bool Obtain()
        {
            var blob = _azureDirectory.BlobContainer.GetBlobClient(_lockFile);

            try
            {
                Debug.WriteLine($"{_azureDirectory.Name} AzureLock:Obtain({_lockFile}) : {_leaseid}");
                if (String.IsNullOrEmpty(_leaseid))
                {
                    var lease = blob.GetBlobLeaseClient().Acquire(TimeSpan.FromSeconds(60));
                    _leaseid = lease.Value.LeaseId;
                    Debug.WriteLine($"{_azureDirectory.Name} AzureLock:Obtain({_lockFile}): AcquireLease : {_leaseid}");

                    // keep the lease alive by renewing every 30 seconds
                    long interval = (long)TimeSpan.FromSeconds(30).TotalMilliseconds;
                    _renewTimer = new Timer((obj) =>
                    {
                        try
                        {
                            AzureLock al = (AzureLock)obj;
                            al.Renew();
                        }
                        catch (Exception err) { Debug.Print(err.ToString()); }
                    }, this, interval, interval);
                }
                return(!String.IsNullOrEmpty(_leaseid));
            }
            catch (RequestFailedException webErr)
            {
                if (_handleWebException(blob, webErr))
                {
                    return(Obtain());
                }
            }

            /*catch (StorageClientException err)
             * {
             *  if (_handleStorageClientException(blob, err))
             *      return Obtain();
             * }*/
            return(false);
        }