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