private void OnSagaTimedOut(TimeoutData timeoutData) { if (SagaTimedOut != null) { SagaTimedOut(null, timeoutData); } }
void IPersistTimeouts.Add(TimeoutData timeout) { var msg = new Message { Body = timeout, Label = timeout.SagaId.ToString() }; storageQueue.Send(msg, MessageQueueTransactionType.Automatic); lock (sagaToMessageIdLookup) sagaToMessageIdLookup[timeout.SagaId] = msg.Id; }
void IManageTimeouts.PushTimeout(TimeoutData timeout) { lock (data) { if (!data.ContainsKey(timeout.Time)) { data[timeout.Time] = new List <TimeoutData>(); } data[timeout.Time].Add(timeout); sagaLookup[timeout.SagaId] = timeout.Time; } }
void IPersistTimeouts.Add(TimeoutData timeout) { string stateAddress = Serialize(timeout.State); context.AddObject(ServiceContext.TimeoutDataEntityTableName, new TimeoutDataEntity(stateAddress, "TimeoutData") { Destination = timeout.Destination.ToString(), SagaId = timeout.SagaId, StateAddress = stateAddress, Time = timeout.Time }); context.SaveChanges(); }
void IPersistTimeouts.Add(TimeoutData timeout) { var stateAddress = Serialize(timeout.State, Hash(timeout)); context.AttachTo(ServiceContext.TimeoutDataEntityTableName, new TimeoutDataEntity("TimeoutData", stateAddress) { Destination = timeout.Destination.ToString(), SagaId = timeout.SagaId, StateAddress = stateAddress, Time = timeout.Time }); context.SaveChanges(SaveChangesOptions.ReplaceOnUpdate); }
public bool CanSend(TimeoutData data) { var hash = Hash(data); var result = (from c in context.TimeoutData where c.RowKey == hash select c).SingleOrDefault(); if (result == null) return false; var leaseBlob = container.GetBlockBlobReference(result.StateAddress); using (var lease = new AutoRenewLease(leaseBlob)) { return lease.HasLease; } }
public void Handle(TimeoutMessage message) { if (message.ClearTimeout) { Manager.ClearTimeout(message.SagaId); Persister.Remove(message.SagaId); } else { var data = new TimeoutData { Destination = Bus.CurrentMessageContext.ReturnAddress, SagaId = message.SagaId, State = message.State, Time = message.Expires }; Manager.PushTimeout(data); Persister.Add(data); } Bus.DoNotContinueDispatchingCurrentMessageToHandlers(); }
private string Hash(TimeoutData timeout) { var s = timeout.SagaId + timeout.Destination + timeout.Time.Ticks; var sha1 = SHA1.Create(); var bytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(s)); var hash = new StringBuilder(); for (var i = 0; i < bytes.Length; i++) { hash.Append(bytes[i].ToString("X2")); } return hash.ToString(); }
void IManageTimeouts.PushTimeout(TimeoutData timeout) { lock (data) { if (!data.ContainsKey(timeout.Time)) data[timeout.Time] = new List<TimeoutData>(); data[timeout.Time].Add(timeout); sagaLookup[timeout.SagaId] = timeout.Time; } }
private void OnSagaTimedOut(TimeoutData timeoutData) { if (SagaTimedOut != null) SagaTimedOut(null, timeoutData); }