示例#1
0
        public void Add(TimeoutData timeout)
        {
            var context = new ServiceContext(account.CreateCloudTableClient());
            var hash    = Hash(timeout);
            TimeoutDataEntity timeoutDataEntity;

            if (TryGetTimeoutData(context, hash, string.Empty, out timeoutDataEntity))
            {
                return;
            }

            var stateAddress = Upload(timeout.State, hash);
            var headers      = Serialize(timeout.Headers);

            if (!TryGetTimeoutData(context, timeout.Time.ToString(PartitionKeyScope), stateAddress, out timeoutDataEntity))
            {
                context.AddObject(ServiceContext.TimeoutDataTableName,
                                  new TimeoutDataEntity(timeout.Time.ToString(PartitionKeyScope), stateAddress)
                {
                    Destination          = timeout.Destination.ToString(),
                    SagaId               = timeout.SagaId,
                    StateAddress         = stateAddress,
                    Time                 = timeout.Time,
                    CorrelationId        = timeout.CorrelationId,
                    OwningTimeoutManager = timeout.OwningTimeoutManager,
                    Headers              = headers
                });
            }

            timeout.Id = stateAddress;

            if (timeout.SagaId != default(Guid) && !TryGetTimeoutData(context, timeout.SagaId.ToString(), stateAddress, out timeoutDataEntity))
            {
                context.AddObject(ServiceContext.TimeoutDataTableName,
                                  new TimeoutDataEntity(timeout.SagaId.ToString(), stateAddress)
                {
                    Destination          = timeout.Destination.ToString(),
                    SagaId               = timeout.SagaId,
                    StateAddress         = stateAddress,
                    Time                 = timeout.Time,
                    CorrelationId        = timeout.CorrelationId,
                    OwningTimeoutManager = timeout.OwningTimeoutManager,
                    Headers              = headers
                });
            }

            context.AddObject(ServiceContext.TimeoutDataTableName,
                              new TimeoutDataEntity(stateAddress, string.Empty)
            {
                Destination          = timeout.Destination.ToString(),
                SagaId               = timeout.SagaId,
                StateAddress         = stateAddress,
                Time                 = timeout.Time,
                CorrelationId        = timeout.CorrelationId,
                OwningTimeoutManager = timeout.OwningTimeoutManager,
                Headers              = headers
            });

            context.SaveChanges();
        }
示例#2
0
        private void MigrateExistingTimeouts(ServiceContext context)
        {
            var existing = (from c in context.TimeoutData
                            where c.PartitionKey == "TimeoutData"
                            select c).ToList();

            foreach (var timeout in existing)
            {
                TimeoutDataEntity timeoutDataEntity;

                if (!TryGetTimeoutData(context, timeout.Time.ToString(PartitionKeyScope), timeout.RowKey, out timeoutDataEntity))
                {
                    context.AddObject(ServiceContext.TimeoutDataTableName,
                                      new TimeoutDataEntity(timeout.Time.ToString(PartitionKeyScope), timeout.RowKey)
                    {
                        Destination          = timeout.Destination,
                        SagaId               = timeout.SagaId,
                        StateAddress         = timeout.RowKey,
                        Time                 = timeout.Time,
                        CorrelationId        = timeout.CorrelationId,
                        OwningTimeoutManager = timeout.OwningTimeoutManager
                    });
                }

                if (!TryGetTimeoutData(context, timeout.SagaId.ToString(), timeout.RowKey, out timeoutDataEntity))
                {
                    context.AddObject(ServiceContext.TimeoutDataTableName,
                                      new TimeoutDataEntity(timeout.SagaId.ToString(), timeout.RowKey)
                    {
                        Destination          = timeout.Destination,
                        SagaId               = timeout.SagaId,
                        StateAddress         = timeout.RowKey,
                        Time                 = timeout.Time,
                        CorrelationId        = timeout.CorrelationId,
                        OwningTimeoutManager = timeout.OwningTimeoutManager
                    });
                }

                if (!TryGetTimeoutData(context, timeout.RowKey, string.Empty, out timeoutDataEntity))
                {
                    context.AddObject(ServiceContext.TimeoutDataTableName,
                                      new TimeoutDataEntity(timeout.RowKey, string.Empty)
                    {
                        Destination          = timeout.Destination,
                        SagaId               = timeout.SagaId,
                        StateAddress         = timeout.RowKey,
                        Time                 = timeout.Time,
                        CorrelationId        = timeout.CorrelationId,
                        OwningTimeoutManager = timeout.OwningTimeoutManager
                    });
                }

                context.DeleteObject(timeout);
                context.SaveChanges();
            }
        }
示例#3
0
        public void Add(TimeoutData timeout)
        {
            var context = new ServiceContext(account.CreateCloudTableClient());
            var hash = Hash(timeout);
            TimeoutDataEntity timeoutDataEntity;
            if (TryGetTimeoutData(context, hash, string.Empty, out timeoutDataEntity)) return;

            var stateAddress = Upload(timeout.State, hash);
            var headers = Serialize(timeout.Headers);

            if (!TryGetTimeoutData(context, timeout.Time.ToString(PartitionKeyScope), stateAddress, out timeoutDataEntity))
                context.AddObject(ServiceContext.TimeoutDataTableName,
                                      new TimeoutDataEntity(timeout.Time.ToString(PartitionKeyScope), stateAddress)
                                      {
                                          Destination = timeout.Destination.ToString(),
                                          SagaId = timeout.SagaId,
                                          StateAddress = stateAddress,
                                          Time = timeout.Time,
                                          CorrelationId = timeout.CorrelationId,
                                          OwningTimeoutManager = timeout.OwningTimeoutManager,
                                          Headers = headers
                                      });

            timeout.Id = stateAddress;

            if (timeout.SagaId != default(Guid) && !TryGetTimeoutData(context, timeout.SagaId.ToString(), stateAddress, out timeoutDataEntity))
                context.AddObject(ServiceContext.TimeoutDataTableName,
                                      new TimeoutDataEntity(timeout.SagaId.ToString(), stateAddress)
                                      {
                                          Destination = timeout.Destination.ToString(),
                                          SagaId = timeout.SagaId,
                                          StateAddress = stateAddress,
                                          Time = timeout.Time,
                                          CorrelationId = timeout.CorrelationId,
                                          OwningTimeoutManager = timeout.OwningTimeoutManager,
                                          Headers = headers
                                      });

            context.AddObject(ServiceContext.TimeoutDataTableName,
                                new TimeoutDataEntity(stateAddress, string.Empty)
                                {
                                    Destination = timeout.Destination.ToString(),
                                    SagaId = timeout.SagaId,
                                    StateAddress = stateAddress,
                                    Time = timeout.Time,
                                    CorrelationId = timeout.CorrelationId,
                                    OwningTimeoutManager = timeout.OwningTimeoutManager,
                                    Headers = headers
                                });

            context.SaveChanges();
        }
示例#4
0
        private void UpdateSuccesfullRead(ServiceContext context, TimeoutManagerDataEntity read)
        {
            try
            {
                if (read == null)
                {
                    read = new TimeoutManagerDataEntity(GetUniqueEndpointName(), string.Empty)
                    {
                        LastSuccessfullRead = DateTime.UtcNow
                    };

                    context.AddObject(ServiceContext.TimeoutManagerDataTableName, read);
                }
                else
                {
                    context.Detach(read);
                    context.AttachTo(ServiceContext.TimeoutManagerDataTableName, read, "*");
                    context.UpdateObject(read);
                }
                context.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate);
            }
            catch (DataServiceRequestException ex) // handle concurrency issues
            {
                var response = ex.Response.FirstOrDefault();
                //Concurrency Exception - PreCondition Failed or Entity Already Exists
                if (response != null && (response.StatusCode == 412 || response.StatusCode == 409))
                {
                    return;
                    // I assume we can ignore this condition?
                    // Time between read and update is very small, meaning that another instance has sent
                    // the timeout messages that this node intended to send and if not we will resend
                    // anything after the other node's last read value anyway on next request.
                }

                throw;
            }
        }
        public void Add(TimeoutData timeout)
        {
            var context = new ServiceContext(account.CreateCloudTableClient()){ IgnoreResourceNotFoundException = true};

            string identifier;
            timeout.Headers.TryGetValue(Headers.MessageId, out identifier);
            if (string.IsNullOrEmpty(identifier)) { identifier = Guid.NewGuid().ToString(); }

            TimeoutDataEntity timeoutDataEntity;
            if (TryGetTimeoutData(context, identifier, string.Empty, out timeoutDataEntity)) return;

            Upload(timeout.State, identifier);
            var headers = Serialize(timeout.Headers);

            if (!TryGetTimeoutData(context, timeout.Time.ToString(PartitionKeyScope), identifier, out timeoutDataEntity))
                context.AddObject(ServiceContext.TimeoutDataTableName,
                                      new TimeoutDataEntity(timeout.Time.ToString(PartitionKeyScope), identifier)
                                      {
                                          Destination = timeout.Destination.ToString(),
                                          SagaId = timeout.SagaId,
                                          StateAddress = identifier,
                                          Time = timeout.Time,
                                          OwningTimeoutManager = timeout.OwningTimeoutManager,
                                          Headers = headers
                                      });

            timeout.Id = identifier;

            if (timeout.SagaId != default(Guid) && !TryGetTimeoutData(context, timeout.SagaId.ToString(), identifier, out timeoutDataEntity))
                context.AddObject(ServiceContext.TimeoutDataTableName,
                                      new TimeoutDataEntity(timeout.SagaId.ToString(), identifier)
                                      {
                                          Destination = timeout.Destination.ToString(),
                                          SagaId = timeout.SagaId,
                                          StateAddress = identifier,
                                          Time = timeout.Time,
                                          OwningTimeoutManager = timeout.OwningTimeoutManager,
                                          Headers = headers
                                      });

            context.AddObject(ServiceContext.TimeoutDataTableName,
                                new TimeoutDataEntity(identifier, string.Empty)
                                {
                                    Destination = timeout.Destination.ToString(),
                                    SagaId = timeout.SagaId,
                                    StateAddress = identifier,
                                    Time = timeout.Time,
                                    OwningTimeoutManager = timeout.OwningTimeoutManager,
                                    Headers = headers
                                });

            context.SaveChanges();
        }
        void UpdateSuccessfulRead(ServiceContext context, TimeoutManagerDataEntity read)
        {
            try
            {
                if (read == null)
                {
                    read = new TimeoutManagerDataEntity(GetUniqueEndpointName(), string.Empty)
                           {
                               LastSuccessfullRead = DateTime.UtcNow
                           };

                    context.AddObject(ServiceContext.TimeoutManagerDataTableName, read);
                }
                else
                {
                    context.Detach(read);
                    context.AttachTo(ServiceContext.TimeoutManagerDataTableName, read, "*");
                    context.UpdateObject(read);
                }
                context.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate);
            }
            catch (DataServiceRequestException ex) // handle concurrency issues
            {
                var response = ex.Response.FirstOrDefault();
                //Concurrency Exception - PreCondition Failed or Entity Already Exists
                if (response != null && (response.StatusCode == 412 || response.StatusCode == 409))
                {
                    return; 
                    // I assume we can ignore this condition? 
                    // Time between read and update is very small, meaning that another instance has sent 
                    // the timeout messages that this node intended to send and if not we will resend 
                    // anything after the other node's last read value anyway on next request.
                }

                throw;
            }

        }
示例#7
0
        private void MigrateExistingTimeouts(ServiceContext context)
        {
            var existing = (from c in context.TimeoutData
                            where c.PartitionKey == "TimeoutData"
                            select c).ToList();

            foreach (var timeout in existing)
            {
                TimeoutDataEntity timeoutDataEntity;

                if (!TryGetTimeoutData(context, timeout.Time.ToString(PartitionKeyScope), timeout.RowKey, out timeoutDataEntity))
                    context.AddObject(ServiceContext.TimeoutDataTableName,
                                      new TimeoutDataEntity(timeout.Time.ToString(PartitionKeyScope), timeout.RowKey)
                                      {
                                          Destination = timeout.Destination,
                                          SagaId = timeout.SagaId,
                                          StateAddress = timeout.RowKey,
                                          Time = timeout.Time,
                                          CorrelationId = timeout.CorrelationId,
                                          OwningTimeoutManager = timeout.OwningTimeoutManager
                                      });

                if (!TryGetTimeoutData(context, timeout.SagaId.ToString(), timeout.RowKey, out timeoutDataEntity))
                    context.AddObject(ServiceContext.TimeoutDataTableName,
                                          new TimeoutDataEntity(timeout.SagaId.ToString(), timeout.RowKey)
                                          {
                                              Destination = timeout.Destination,
                                              SagaId = timeout.SagaId,
                                              StateAddress = timeout.RowKey,
                                              Time = timeout.Time,
                                              CorrelationId = timeout.CorrelationId,
                                              OwningTimeoutManager = timeout.OwningTimeoutManager
                                          });

                if (!TryGetTimeoutData(context, timeout.RowKey, string.Empty, out timeoutDataEntity))
                    context.AddObject(ServiceContext.TimeoutDataTableName,
                                      new TimeoutDataEntity(timeout.RowKey, string.Empty)
                                      {
                                          Destination = timeout.Destination,
                                          SagaId = timeout.SagaId,
                                          StateAddress = timeout.RowKey,
                                          Time = timeout.Time,
                                          CorrelationId = timeout.CorrelationId,
                                          OwningTimeoutManager = timeout.OwningTimeoutManager
                                      });

                context.DeleteObject(timeout);
                context.SaveChanges();
            }
        }
示例#8
0
        public void Add(TimeoutData timeout)
        {
            var context = new ServiceContext(account.CreateCloudTableClient())
            {
                IgnoreResourceNotFoundException = true
            };

            string identifier;

            timeout.Headers.TryGetValue(Headers.MessageId, out identifier);
            if (string.IsNullOrEmpty(identifier))
            {
                identifier = Guid.NewGuid().ToString();
            }

            TimeoutDataEntity timeoutDataEntity;

            if (TryGetTimeoutData(context, identifier, string.Empty, out timeoutDataEntity))
            {
                return;
            }

            Upload(timeout.State, identifier);
            var headers = Serialize(timeout.Headers);

            if (!TryGetTimeoutData(context, timeout.Time.ToString(PartitionKeyScope), identifier, out timeoutDataEntity))
            {
                context.AddObject(ServiceContext.TimeoutDataTableName,
                                  new TimeoutDataEntity(timeout.Time.ToString(PartitionKeyScope), identifier)
                {
                    Destination          = timeout.Destination.ToString(),
                    SagaId               = timeout.SagaId,
                    StateAddress         = identifier,
                    Time                 = timeout.Time,
                    OwningTimeoutManager = timeout.OwningTimeoutManager,
                    Headers              = headers
                });
            }

            timeout.Id = identifier;

            if (timeout.SagaId != default(Guid) && !TryGetTimeoutData(context, timeout.SagaId.ToString(), identifier, out timeoutDataEntity))
            {
                context.AddObject(ServiceContext.TimeoutDataTableName,
                                  new TimeoutDataEntity(timeout.SagaId.ToString(), identifier)
                {
                    Destination          = timeout.Destination.ToString(),
                    SagaId               = timeout.SagaId,
                    StateAddress         = identifier,
                    Time                 = timeout.Time,
                    OwningTimeoutManager = timeout.OwningTimeoutManager,
                    Headers              = headers
                });
            }

            context.AddObject(ServiceContext.TimeoutDataTableName,
                              new TimeoutDataEntity(identifier, string.Empty)
            {
                Destination          = timeout.Destination.ToString(),
                SagaId               = timeout.SagaId,
                StateAddress         = identifier,
                Time                 = timeout.Time,
                OwningTimeoutManager = timeout.OwningTimeoutManager,
                Headers              = headers
            });

            context.SaveChanges();
        }