static async Task Main(string[] args)
        {
            //esdb://localhost:2113?tls=false

            var settings = EventStoreClientSettings
                           .Create("esdb://localhost:2113?tls=false");
            var client = new EventStoreClient(settings);

            //await TestReadFromtombstoned(client);

            var projectionClient = new EventStoreProjectionManagementClient(settings);
            var operationsClient = new EventStoreOperationsClient(settings);

            await client.SoftDeleteAsync("dokimi-1", StreamState.Any);

            await client.SoftDeleteAsync("dokimi-2", StreamState.Any);

            await client.SoftDeleteAsync("dokimi-3", StreamState.Any);


            //await projectionClient.DisableAsync("$by_category");
            //var result = await operationsClient.StartScavengeAsync();
            //await Task.Delay(TimeSpan.FromSeconds(20));
            //await projectionClient.EnableAsync("$by_category");
            //await projectionClient.ResetAsync("$by_category");
            //var readDeltedStreamResult = client.ReadStreamAsync(Direction.Forwards, "test", StreamPosition.Start);

            //Console.WriteLine("Stream existed: {0}\nSteam was empty: {1}",
            //    await readDeltedStreamResult.ReadState,
            //    await readDeltedStreamResult.CountAsync());

            var data = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(new Data()
            {
                Value = 5
            }));
            var writeResult = await client.AppendToStreamAsync("dokimi-1", StreamRevision.FromInt64(-1),
                                                               new[] { new EventData(Uuid.NewUuid(), "TestType", data) });

            writeResult = await client.AppendToStreamAsync("dokimi-2", StreamRevision.FromInt64(-1),
                                                           new[] { new EventData(Uuid.NewUuid(), "TestType", data) });

            writeResult = await client.AppendToStreamAsync("dokimi-3", StreamRevision.FromInt64(-1),
                                                           new[] { new EventData(Uuid.NewUuid(), "TestType", data) });

            await Task.Delay(TimeSpan.FromSeconds(10));

            var readResult = client.ReadStreamAsync(Direction.Forwards, "$ce-dokimi",
                                                    StreamPosition.Start,
                                                    resolveLinkTos: true);
            var isSuccess = await readResult.ReadState;
            var events    = await readResult.Where(x => x.Event != null).ToListAsync();

            var eventCount = events.Count;

            var readResultStream = client.ReadStreamAsync(Direction.Forwards, "dokimi-2", StreamPosition.Start);
            var isSuccessStream  = await readResultStream.ReadState;
            var eventsInStream   = await readResultStream.ToListAsync();

            var eventCountStream = eventsInStream.Count;

            Console.WriteLine("Could read stream: {0}", isSuccess);
            Console.WriteLine("Found {0} events", eventCount);

            Console.WriteLine("Press any key to exit!");
            Console.ReadKey();
        }
 public void FromInt64ExpectedResult(long value, StreamRevision expected)
 => Assert.AreEqual(expected, StreamRevision.FromInt64(value));
 public static StreamRevision AsStreamRevision(this ExpectedStreamVersion version)
 => StreamRevision.FromInt64(version.Value);
示例#4
0
        public async Task DeleteAsync <TAggregate>(TAggregate aggregate) where TAggregate : class, IAggregateRoot
        {
            string streamName = $"{aggregate.GetType().Name}:{aggregate.Id}";
            await Policies.RedisFallbackPolicy.ExecuteAsync(() => _cache.KeyDeleteAsync(streamName));

            var service = _context.GetService <IAggregateMap <TAggregate> >();

            if (service != null)
            {
                await Policies.SqRetryPolicy.ExecuteAsync(() => service.DeleteAsync(aggregate));
            }

            var result = await Policies.EventStoreRetryPolicy.ExecuteAndCaptureAsync(() => _eventStoreClient.TombstoneAsync(streamName, StreamRevision.FromInt64(aggregate.Version)));

            if (result.Outcome == OutcomeType.Successful)
            {
                await Policies.RedisFallbackPolicy.ExecuteAsync(() => _cache.KeyDeleteAsync(streamName));

                return;
            }

            if (service != null)
            {
                var publishResult = await Policies.PublishRetryPolicy.ExecuteAndCaptureAsync(() => _publishEndpoint.Publish(new AggregateInOutOfSyncState()
                {
                    AggregateId = aggregate.Id,
                    Type        = aggregate.GetType().FullName,
                    Version     = aggregate.Version
                }));

                if (publishResult.Outcome == OutcomeType.Failure)
                {
                    throw new AggregateInOutOfSyncException(aggregate, result.FinalException);
                }

                throw result.FinalException;
            }
        }
        protected override async Task WriteEventsToStoreAsync(IEnumerable <IDomainEventDescriptor> events, CancellationToken cancellationToken)
        {
            var aggregateGroup = events.GroupBy(x => GenerateStreamId(x.AggregateType, x.AggregateId));

            var eventDataGroups = aggregateGroup.Select(group =>
            {
                var eventList = group.ToList();

                var eventDatas = eventList.Select(x =>
                {
                    byte[] data;
                    byte[] metadata;

                    // serialize data
                    using (var ms = new MemoryStream())
                        using (var writer = new BsonDataWriter(ms))
                        {
                            JsonSerializer serializer   = new JsonSerializer();
                            serializer.TypeNameHandling = TypeNameHandling.All;
                            serializer.Serialize(writer, x.Event);
                            data = ms.ToArray();
                        }

                    // serialize metadata
                    using (var ms = new MemoryStream())
                        using (var writer = new BsonDataWriter(ms))
                        {
                            JsonSerializer serializer = new JsonSerializer();
                            serializer.Serialize(writer, x.Metadata);
                            metadata = ms.ToArray();
                        }

                    return(new EventData(
                               Uuid.FromGuid(x.EventId),
                               x.EventType,
                               data,
                               metadata,
                               "application/octet-stream"
                               ));
                });

                if (eventList.Any(x => x.IsPublished))
                {
                    throw new InvalidOperationException("Cannot publish events that have been published");
                }

                var firstEvent = eventList.First();

                return(StreamId: group.Key, EventDatas: eventDatas, ExpectedVersionBeforeAppend: firstEvent.Version - 1L);
            });

            foreach (var group in eventDataGroups)
            {
                // expect no stream when there is not positive version
                if (group.ExpectedVersionBeforeAppend == -1)
                {
                    await EventStoreClient.AppendToStreamAsync(
                        group.StreamId,
                        StreamState.NoStream,
                        group.EventDatas,
                        cancellationToken : cancellationToken
                        );
                }
                // expect stream when there an unknow version
                else if (group.ExpectedVersionBeforeAppend == DomainEventDescriptor.UnknowVersion - 1)
                {
                    await EventStoreClient.AppendToStreamAsync(
                        group.StreamId,
                        StreamState.StreamExists,
                        group.EventDatas,
                        cancellationToken : cancellationToken
                        );
                }
                // expect stream when there is a valid version
                else
                {
                    await EventStoreClient.AppendToStreamAsync(
                        group.StreamId,
                        StreamRevision.FromInt64(group.ExpectedVersionBeforeAppend),
                        group.EventDatas,
                        cancellationToken : cancellationToken
                        );
                }
            }
        }
示例#6
0
文件: Utils.cs 项目: jrlost/squidex
 public static StreamRevision ToRevision(this long version)
 {
     return(StreamRevision.FromInt64(version));
 }