void AppendToStream(IIdentity id, string envelopeId, Applied then, string explanation) { var stream = _factory.GetOrCreateStream(IdentityConvert.ToStream(id)); var b = new EnvelopeBuilder("unknown"); b.AddString("caused-by", envelopeId); if (!String.IsNullOrEmpty(explanation)) { b.AddString("explain", explanation); } foreach (var e in then.Events) { b.AddItem((object)e); } var data = _streamer.SaveEnvelopeData(b.Build()); Context.Debug("?? Append {0} at v{3} to '{1}' in thread {2}", then.Events.Count, IdentityConvert.ToStream(id), Thread.CurrentThread.ManagedThreadId, then.Version); if (!stream.TryAppend(data, TapeAppendCondition.VersionIs(then.Version))) { throw new InvalidOperationException("Failed to update the stream - it has been changed concurrently"); } }
private void SendMessage(object command, string optionalID = null) { var auth = FormsAuth.GetSessionIdentityFromRequest(); var envelopeId = optionalID ?? Guid.NewGuid().ToString().ToLowerInvariant(); var eb = new EnvelopeBuilder(envelopeId); if (auth.HasValue) { eb.AddString("web-user", auth.Value.User.Identifier.ToString(CultureInfo.InvariantCulture)); eb.AddString("web-token", auth.Value.Token); } eb.AddItem(command); m_queueWriter.PutMessage(eb.Build()); }
public void AppendToStream(IIdentity id, long originalVersion, ICollection<IEvent<IIdentity>> events, string explanation) { if (events.Count == 0) return; var stream = _factory.GetOrCreateStream(IdentityConvert.ToStream(id)); var b = new EnvelopeBuilder("unknown"); if (!String.IsNullOrEmpty(explanation)) { b.AddString("explain", explanation); } foreach (var e in events) { b.AddItem((object)e); } var data = _streamer.SaveEnvelopeData(b.Build()); var result = stream.TryAppend(data, TapeAppendCondition.VersionIs(originalVersion)); if (result == 0) { throw new InvalidOperationException("Failed to update the stream - it has been changed concurrently"); } PublishDomainSuccess(id, events, originalVersion); }
private void PutLocalIP(EnvelopeBuilder builder) { var ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList .Where(address => address.AddressFamily == AddressFamily.InterNetwork) .FirstOrDefault(); builder.AddString(ContextAttributes.ORIGINATING_MACHINE, ip==null ? "?" : ip.ToString()); }
void SendMessage(object command, string optionalId) { var auth = FormsAuth.GetSessionIdentityFromRequest(); var envelopeId = optionalId ?? Guid.NewGuid().ToString().ToLowerInvariant(); var eb = new EnvelopeBuilder(envelopeId); if (auth.HasValue) { eb.AddString("web-user", auth.Value.User.Id.ToString(CultureInfo.InvariantCulture)); eb.AddString("web-token", auth.Value.Token); } eb.AddItem(command); _writer.PutMessage(_streamer.SaveEnvelopeData(eb.Build())); }
private void PutLocalIP(EnvelopeBuilder builder) { var ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList .Where(address => address.AddressFamily == AddressFamily.InterNetwork) .FirstOrDefault(); builder.AddString(ContextAttributes.ORIGINATING_MACHINE, ip == null ? "?" : ip.ToString()); }
public void Test() { var b = new EnvelopeBuilder("GUID"); b.DelayBy(TimeSpan.FromSeconds(10)); b.AddString("Test"); b.AddItem(new { Cool = "1"}).AddAttribute("D2","D1"); Console.WriteLine(b.Build().PrintToString(o => o.Dump())); }
private static void AddHeadersToEnvelope(Dictionary <string, object> headers, EnvelopeBuilder b) { if (headers == null) { return; } foreach (var header in headers) { b.AddString(header.Key, header.Value.ToString()); } }
public void Envelope_attributes_should_be_present() { var time = DateTime.UtcNow; var builder = new EnvelopeBuilder("my-id"); builder.AddString("Custom", "1"); var envelope = RoundtripViaSerializer(builder); Assert.AreEqual("1", envelope.GetAttribute("Custom")); Assert.GreaterOrEqual(envelope.CreatedOnUtc, time, "start time"); var now = DateTime.UtcNow; Assert.LessOrEqual(envelope.CreatedOnUtc, now, "now"); }
void PublishEvents(IIdentity id, Applied then) { var arVersion = then.Version + 1; var arName = IdentityConvert.ToTransportable(id); var name = String.Format("{0}-{1}", arName, arVersion); var builder = new EnvelopeBuilder(name); builder.AddString("entity", arName); foreach (var @event in then.Events) { builder.AddItem((object)@event); } _writer.PutMessage(_streamer.SaveEnvelopeData(builder.Build())); }
void Dispatch(string id, IEnumerable<ICommand> commands) { var stream = _factory.GetOrCreateStream(id); var records = stream.ReadRecords(0, int.MaxValue).ToList(); var events = records .Select(tr => _streamer.ReadAsEnvelopeData(tr.Data)) .SelectMany(i => i.Items) .Select(i => (IEvent)i.Content) .ToList(); var then = AggregateFactory .LoadProject(events, commands) .Select(e => new MessageBuilder(e.GetType(), e)).ToList(); if (then.Count == 0) return; // events are stored here as envelopes ) var b = new EnvelopeBuilder("unknown"); foreach (var e in then) { b.Items.Add(e); } var version = records.Count == 0 ? 0 : records.Last().Version; var data = _streamer.SaveEnvelopeData(b.Build()); var result = stream.TryAppend( data, TapeAppendCondition.VersionIs(version)); if (!result) throw new InvalidOperationException( "Data was modified concurrently, and we don't have merging implemented, yet"); var args = _path.Split(':'); IQueueWriterFactory factory; if (!_queue.TryGet(args[0], out factory)) throw new InvalidOperationException("Not found " + _path); var arVersion = events.Count + 1; var arName = id; for (int i = 0; i < then.Count; i++) { var name = string.Format("{0}/{1}/{2}", arName, arVersion, i); var builder = new EnvelopeBuilder(name); builder.Items.Add(then[i]); builder.AddString("from-entity", arName); factory.GetWriteQueue(args[1]).PutMessage(builder.Build()); } }
void Dispatch(string id, IEnumerable <ICommand> commands) { var stream = _factory.GetOrCreateStream(id); var records = stream.ReadRecords(0, int.MaxValue).ToList(); var events = records .Select(tr => _streamer.ReadAsEnvelopeData(tr.Data)) .SelectMany(i => i.Items) .Select(i => (IEvent)i.Content) .ToList(); var then = AggregateFactory .LoadProject(events, commands) .Select(e => new MessageBuilder(e.GetType(), e)).ToList(); if (then.Count == 0) { return; } // events are stored here as envelopes ) var b = new EnvelopeBuilder("unknown"); foreach (var e in then) { b.Items.Add(e); } var version = records.Count == 0 ? 0 : records.Last().Version; var data = _streamer.SaveEnvelopeData(b.Build()); var result = stream.TryAppend(data, TapeAppendCondition.VersionIs(version)); if (!result) { throw new InvalidOperationException( "Data was modified concurrently, and we don't have merging implemented, yet"); } var args = _path.Split(':'); IQueueWriterFactory factory; if (!_queue.TryGet(args[0], out factory)) { throw new InvalidOperationException("Not found " + _path); } var arVersion = events.Count + 1; var arName = id; for (int i = 0; i < then.Count; i++) { var name = string.Format("{0}/{1}/{2}", arName, arVersion, i); var builder = new EnvelopeBuilder(name); builder.Items.Add(then[i]); builder.AddString("from-entity", arName); factory.GetWriteQueue(args[1]).PutMessage(builder.Build()); } }
private static void AddHeadersToEnvelope(Dictionary<string, object> headers, EnvelopeBuilder b) { if (headers == null) return; foreach (var header in headers) { b.AddString(header.Key, header.Value.ToString()); } }
void PublishDomainSuccess(IIdentity id, IEnumerable<IEvent> events, long version) { var arVersion = version + 1; var arName = IdentityConvert.ToTransportable(id); var name = String.Format("{0}-{1}", arName, arVersion); var builder = new EnvelopeBuilder(name); builder.AddString("entity", arName); foreach (var @event in events) { builder.AddItem((object)@event); } _writer.PutMessage(_streamer.SaveEnvelopeData(builder.Build())); }