void InnerSendBatch(Action<EnvelopeBuilder> configure, object[] messageItems) { if (messageItems.Length == 0) return; var id = _idGenerator(); var builder = new EnvelopeBuilder(id); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var queue = GetOutboundQueue(); if (Transaction.Current == null) { queue.PutMessage(envelope); _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, false, envelope.Items.Select(x => x.MappedType.Name).ToArray())); } else { var action = new CommitActionEnlistment(() => { queue.PutMessage(envelope); _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, true, envelope.Items.Select(x => x.MappedType.Name).ToArray())); }); Transaction.Current.EnlistVolatile(action, EnlistmentOptions.None); } }
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); }
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"); } }
public static ImmutableEnvelope BuildEnvelope(this IMessage message) { var eb = new EnvelopeBuilder(Guid.NewGuid().ToString()); eb.AddItem((object) message); return eb.Build(); }
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())); }
public static byte[] SaveEnvelopeData(this IEnvelopeStreamer streamer, object message, Action<EnvelopeBuilder> build = null) { var builder = new EnvelopeBuilder(Guid.NewGuid().ToString()); builder.AddItem(message); if (null != build) { build(builder); } return streamer.SaveEnvelopeData(builder.Build()); }
public static byte[] SaveEnvelopeData(this IEnvelopeStreamer streamer, object message, Action <EnvelopeBuilder> build = null) { var builder = new EnvelopeBuilder(Guid.NewGuid().ToString()); builder.AddItem(message); if (null != build) { build(builder); } return(streamer.SaveEnvelopeData(builder.Build())); }
public void command_sender_should_send_envelope() { // arrange var builder = new EnvelopeBuilder("env"); builder.AddItem(new CreateAccount(Identifier)); builder.AddItem(new CreateAccount(Identifier)); builder.AddItem(new CreateAccount(Identifier)); // act Sender.SendEnvelope(builder.Build()); // assert }
public void DispatchCommand(object command, Action<EnvelopeBuilder> builder = null) { var envelopeBuilder = new EnvelopeBuilder(Guid.NewGuid().ToString()); envelopeBuilder.AddItem(command); if (builder != null) builder(envelopeBuilder); var envelope = envelopeBuilder.Build(); var data = _serializer.SaveEnvelopeData(envelope); if (!_tapeStream.TryAppend(data)) throw new InvalidOperationException("Failed to record domain log"); _aggregateFactory.Dispatch(envelope); }
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 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())); }
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()); }
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())); }
string HashContents(Action <EnvelopeBuilder> configure, object[] messageItems) { var builder = new EnvelopeBuilder("hash"); builder.OverrideCreatedOnUtc(DateTime.MinValue); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var data = _streamer.SaveEnvelopeData(envelope); using (var sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(data); return(BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant()); } }
public override void Handle(IHttpContext context) { var msg = new EnvelopeBuilder(Guid.NewGuid().ToString()); var contract = context.GetRequestUrl().Remove(0,"/send/".Length); Type contractType; if (!_serializer.TryGetContractTypeByName(contract, out contractType)) { context.WriteString(string.Format("Trying to post command with unknown contract '{0}'.", contract)); context.SetStatusTo(HttpStatusCode.BadRequest); return; } _writer.PutMessage(_streamer.SaveEnvelopeData(msg.Build())); context.WriteString(string.Format(@" Normally this should be a JSON POST, containing serialized data for {0} but let's pretend that you successfully sent a message. Or routed it", contractType)); context.SetStatusTo(HttpStatusCode.OK); }
public void DispatchCommand(object command, Action <EnvelopeBuilder> builder = null) { var envelopeBuilder = new EnvelopeBuilder(Guid.NewGuid().ToString()); envelopeBuilder.AddItem(command); if (builder != null) { builder(envelopeBuilder); } var envelope = envelopeBuilder.Build(); var data = _serializer.SaveEnvelopeData(envelope); if (!_tapeStream.TryAppend(data)) { throw new InvalidOperationException("Failed to record domain log"); } _aggregateFactory.Dispatch(envelope); }
public void AppendToStream(IIdentity id, long originalVersion, ICollection<IEvent> events) { if (events.Count == 0) return; var stream = _factory.GetOrCreateStream(IdentityConvert.ToStream(id)); var b = new EnvelopeBuilder("unknown"); 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) { // this is temporary implementation throw OptimisticConcurrencyException.Create(-1, originalVersion, id, null); } PublishDomainSuccess(id, events, originalVersion); }
public override void Handle(IHttpContext context) { var contract = context.GetRequestUrl().Remove(0, "/mouseevents/".Length); var envelopeBuilder = new EnvelopeBuilder(contract + " - " + DateTime.Now.Ticks.ToString()); Type contractType; if (!_serializer.TryGetContractTypeByName(contract, out contractType)) { context.WriteString(string.Format("Trying to post command with unknown contract '{0}'.", contract)); context.SetStatusTo(HttpStatusCode.BadRequest); return; } var decodedData = HttpUtility.UrlDecode(context.Request.QueryString.ToString()); var mouseEvent = JsonSerializer.DeserializeFromString(decodedData, contractType); envelopeBuilder.AddItem(mouseEvent); _writer.PutMessage(_streamer.SaveEnvelopeData(envelopeBuilder.Build())); context.SetStatusTo(HttpStatusCode.OK); }
public override void Handle(IHttpContext context) { var msg = new EnvelopeBuilder(Guid.NewGuid().ToString()); var contract = context.GetRequestUrl().Remove(0, "/send/".Length); Type contractType; if (!_serializer.TryGetContractTypeByName(contract, out contractType)) { context.WriteString(string.Format("Trying to post command with unknown contract '{0}'.", contract)); context.SetStatusTo(HttpStatusCode.BadRequest); return; } _writer.PutMessage(_streamer.SaveEnvelopeData(msg.Build())); context.WriteString(string.Format(@" Normally this should be a JSON POST, containing serialized data for {0} but let's pretend that you successfully sent a message. Or routed it", contractType)); context.SetStatusTo(HttpStatusCode.OK); }
void InnerSendBatch(Action <EnvelopeBuilder> configure, object[] messageItems) { if (messageItems.Length == 0) { return; } var id = _idGenerator(); var builder = new EnvelopeBuilder(id); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var queue = GetOutboundQueue(); if (Transaction.Current == null) { queue.PutMessage(envelope); _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, false, envelope.Items.Select(x => x.MappedType.Name).ToArray())); } else { var action = new CommitActionEnlistment(() => { queue.PutMessage(envelope); _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, true, envelope.Items.Select(x => x.MappedType.Name).ToArray())); }); Transaction.Current.EnlistVolatile(action, EnlistmentOptions.None); } }
void InnerSendBatch(Action <EnvelopeBuilder> configure, object[] messageItems, IdGeneration id = IdGeneration.Default) { string envelopeId; switch (id) { case IdGeneration.Default: envelopeId = _idGenerator(); break; case IdGeneration.HashContent: envelopeId = HashContents(configure, messageItems); break; default: throw new ArgumentOutOfRangeException("id"); } var builder = new EnvelopeBuilder(envelopeId); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var data = _streamer.SaveEnvelopeData(envelope); var queue = GetOutboundQueue(); queue.PutMessage(data); SystemObserver.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, envelope.Items.Select(x => x.MappedType.Name).ToArray(), envelope.GetAllAttributes())); }
void InnerSendBatch(Action<EnvelopeBuilder> configure, object[] messageItems, IdGeneration id = IdGeneration.Default) { string envelopeId; switch (id) { case IdGeneration.Default: envelopeId = _idGenerator(); break; case IdGeneration.HashContent: envelopeId = HashContents(configure, messageItems); break; default: throw new ArgumentOutOfRangeException("id"); } var builder = new EnvelopeBuilder(envelopeId); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var data = _streamer.SaveEnvelopeData(envelope); var queue = GetOutboundQueue(); queue.PutMessage(data); SystemObserver.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, envelope.Items.Select(x => x.MappedType.Name).ToArray(), envelope.GetAllAttributes())); }
protected override ImmutableEnvelope RoundtripViaSerializer(EnvelopeBuilder builder) { var bytes = _streamer.SaveEnvelopeData(builder.Build()); return _streamer.ReadAsEnvelopeData(bytes); }
void InnerSendBatch(Action<EnvelopeBuilder> configure, object[] messageItems) { var id = _idGenerator(); var builder = new EnvelopeBuilder(id); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); SendEnvelope(envelope); }
protected override ImmutableEnvelope RoundtripViaSerializer(EnvelopeBuilder builder) { return builder.Build(); }
string HashContents(Action<EnvelopeBuilder> configure, object[] messageItems) { var builder = new EnvelopeBuilder("hash"); builder.OverrideCreatedOnUtc(DateTime.MinValue); foreach (var item in messageItems) { builder.AddItem(item); } configure(builder); var envelope = builder.Build(); var data = _streamer.SaveEnvelopeData(envelope); using (var sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(data); return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); } }
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())); }
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()); } }