Exemplo n.º 1
0
        protected override void SetUpPerTest(QueueStorage storage, EventStorage eventStorage)
        {
            using (var sqlConnection = new SqlConnection(ConnectionString))
            {
                sqlConnection.Open();

                using (var cmd = new SqlCommand("truncate table Events;", sqlConnection))
                {
                    cmd.ExecuteNonQuery();
                }

                using (var cmd = new SqlCommand("truncate table Streams;", sqlConnection))
                {
                    cmd.ExecuteNonQuery();
                }

                using (var cmd = new SqlCommand("truncate table QueueAllocations;", sqlConnection))
                {
                    cmd.ExecuteNonQuery();
                }

                using (var cmd = new SqlCommand("truncate table Queues;", sqlConnection))
                {
                    cmd.ExecuteNonQuery();
                }
            }
        }
Exemplo n.º 2
0
 public EventListenerBackgroundService(
     EventStorage eventStorage,
     ISlackEventIdentifier slackEventIdentifier)
 {
     _eventStorage         = eventStorage;
     _slackEventIdentifier = slackEventIdentifier;
 }
Exemplo n.º 3
0
        protected async Task <bool> RaiseEvent(IEventBase <K> @event, string uniqueId = null, string mqHashKey = null)
        {
            try
            {
                @event.StateId   = GrainId;
                @event.Version   = this.State.Version + 1;
                @event.Timestamp = DateTime.Now;
                using (var ms = new MemoryStream())
                {
                    Serializer.Serialize(ms, @event);
                    var bytes  = ms.ToArray();
                    var result = await EventStorage.InsertAsync(@event, bytes, uniqueId, SendEventToMQ);

                    if (result)
                    {
                        @event.Apply(this.State);
                        await EventInsertAfterHandle(@event, bytes, mqHashKey : mqHashKey);

                        RaiseEventAfter(@event, bytes);
                        return(true);
                    }
                }
            }
            catch (Exception ex)
            {
                this.GetLogger("Event_Raise").Log(LogCodes.EventRaiseError, Orleans.Runtime.Severity.Error, $"applay event {@event.TypeCode} error, eventId={@event.Version}", null, ex);
                throw ex;
            }
            return(false);
        }
Exemplo n.º 4
0
        public void SetUp()
        {
            _eventStorage = GetEventStorage();
            _queueStorage = GetQueueStorage();

            SetUpPerTest(_queueStorage, _eventStorage);
        }
 // Use this for initialization
 void Start()
 {
     _eventStorage = EventStorage.Instance;
     _eventStorage.ConnectionEstablished.AddListener(_startWeatherUpdate);
     _eventStorage.ConnectionTerminated.AddListener(_stopWeatherUpdate);
     Debug.Log("Weather subscribed.");
 }
Exemplo n.º 6
0
        private async Task EventInsertAfterHandle(IEventBase <K> @event, byte[] bytes, int recursion = 0, string mqHashKey = null)
        {
            try
            {
                if (SendEventToMQ)
                {
                    if (string.IsNullOrEmpty(mqHashKey))
                    {
                        mqHashKey = GrainId.ToString();
                    }
                    //消息写入消息队列
                    await MQService.Send(@event, bytes, mqHashKey);
                }
                //更改消息状态
                await EventStorage.Complete(@event);

                //保存快照
                await SaveSnapshotAsync();
            }
            catch (Exception e)
            {
                if (recursion > 5)
                {
                    throw e;
                }
                this.GetLogger("Event_Raise").Log(LogCodes.EventCompleteError, Orleans.Runtime.Severity.Error, "事件complate操作出现致命异常:" + string.Format("Grain类型={0},GrainId={1},StateId={2},Version={3},错误信息:{4}", ThisType.FullName, GrainId, @event.StateId, @event.Version, e.Message), null, e);
                int newRecursion = recursion + 1;
                await Task.Delay(newRecursion * 200);
                await EventInsertAfterHandle(@event, bytes, newRecursion, mqHashKey : mqHashKey);
            }
        }
Exemplo n.º 7
0
        protected override async ValueTask OnFinshTransaction(long transactionId)
        {
            if (transactionId > 0)
            {
                if (!TransactionOptions.RetainTxEvents)
                {
                    if (Snapshot.Base is TxSnapshotBase <PrimaryKey> snapshotBase &&
                        BackupSnapshot.Base is TxSnapshotBase <PrimaryKey> backupSnapshotBase)
                    {
                        //删除最后一个TransactionCommitEvent
                        await EventStorage.DeleteByVersion(Snapshot.Base.StateId, snapshotBase.TransactionStartVersion, snapshotBase.TransactionStartTimestamp);

                        var txCommitEvent = WaitingForTransactionTransports.Single(o => o.FullyEvent.Base.Version == snapshotBase.TransactionStartVersion);
                        WaitingForTransactionTransports.Remove(txCommitEvent);
                        snapshotBase.ClearTransactionInfo(true);
                        backupSnapshotBase.ClearTransactionInfo(true);
                    }
                    else
                    {
                        throw new SnapshotNotSupportTxException(Snapshot.GetType());
                    }
                }
                else
                {
                    await base.RaiseEvent(new TxFinishedEvent(transactionId));
                }
            }
        }
Exemplo n.º 8
0
 public Standard(EventStorage _events, Config _config, CommandService _commands, IServiceProvider _services)
 {
     events   = _events;
     config   = _config;
     commands = _commands;
     services = _services;
 }
Exemplo n.º 9
0
        protected override async ValueTask OnFinshTransaction(long transactionId)
        {
            if (transactionId > 0)
            {
                if (!TransactionOptions.RetainTxEvents)
                {
                    //删除最后一个TransactionCommitEvent
                    await EventStorage.DeleteEnd(Snapshot.Base.StateId, Snapshot.Base.Version, Snapshot.Base.LatestMinEventTimestamp);

                    if (Snapshot.Base is TxSnapshotBase <PrimaryKey> snapshotBase &&
                        BackupSnapshot.Base is TxSnapshotBase <PrimaryKey> backupSnapshotBase)
                    {
                        snapshotBase.ClearTransactionInfo(true);
                        backupSnapshotBase.ClearTransactionInfo(true);
                    }
                    else
                    {
                        throw new SnapshotNotSupportTxException(Snapshot.GetType());
                    }
                }
                else
                {
                    await base.RaiseEvent(new TxFinishedEvent(transactionId));
                }
            }
        }
Exemplo n.º 10
0
        protected async ValueTask<bool> RaiseEvent(IEventBase<K> @event, string uniqueId = null, string hashKey = null)
        {
            try
            {
                this.State.IncrementDoingVersion();//标记将要处理的Version
                @event.StateId = GrainId;
                @event.Version = this.State.Version + 1;
                @event.Timestamp = DateTime.UtcNow;
                using (var ms = new PooledMemoryStream())
                {
                    Serializer.Serialize(ms, @event);
                    var bytes = ms.ToArray();
                    var result = await EventStorage.SaveAsync(@event, bytes, uniqueId);
                    if (result)
                    {
                        EventHandle.Apply(this.State, @event);
                        await AfterEventSavedHandle(@event, bytes, hashKey: hashKey);

                        this.State.UpdateVersion(@event);//更新处理完成的Version

                        await SaveSnapshotAsync();
                        return true;
                    }
                    else
                        this.State.DecrementDoingVersion();//还原doing Version
                }
            }
            catch (Exception ex)
            {
                this.GetLogger("Event_Raise").Log(LogCodes.EventRaiseError, Orleans.Runtime.Severity.Error, $"applay event {@event.TypeCode} error, eventId={@event.Version}", null, ex);
                await OnActivateAsync();//重新激活Actor
                throw ex;
            }
            return false;
        }
Exemplo n.º 11
0
        protected virtual async Task AfterEventSavedHandle(IEventBase <K> @event, byte[] bytes, int recursion = 0, string hashKey = null)
        {
            try
            {
                if (string.IsNullOrEmpty(hashKey))
                {
                    hashKey = GrainId.ToString();
                }
                //消息写入消息队列
                await MQService.Publish(@event, bytes, hashKey);

                //更改消息状态
                await EventStorage.CompleteAsync(@event);
            }
            catch (Exception e)
            {
                if (recursion > 5)
                {
                    throw e;
                }
                this.GetLogger("Event_Raise").Log(LogCodes.EventCompleteError, Orleans.Runtime.Severity.Error, "事件complate操作出现致命异常:" + string.Format("Grain类型={0},GrainId={1},StateId={2},Version={3},错误信息:{4}", ThisType.FullName, GrainId, @event.StateId, @event.Version, e.Message), null, e);
                int newRecursion = recursion + 1;
                await Task.Delay(newRecursion * 200);
                await AfterEventSavedHandle(@event, bytes, newRecursion, hashKey : hashKey);
            }
        }
Exemplo n.º 12
0
        public override async Task OnActivateAsync()
        {
            await ReadSnapshotAsync();

            while (true)
            {
                var eventList = await EventStorage.GetListAsync(this.GrainId, this.State.Version, this.State.Version + 1000, this.State.VersionTime);

                foreach (var @event in eventList)
                {
                    this.State.IncrementDoingVersion();//标记将要处理的Version
                    EventHandle.Apply(this.State, @event.Event);
                    if ([email protected])
                    {
                        using (var ms = new PooledMemoryStream())
                        {
                            Serializer.Serialize(ms, @event.Event);
                            await AfterEventSavedHandle(@event.Event, ms.ToArray());
                        }
                    }
                    this.State.UpdateVersion(@event.Event);//更新处理完成的Version
                }
                if (eventList.Count < 1000)
                {
                    break;
                }
            }
            ;
        }
Exemplo n.º 13
0
        public void Repository_Get()
        {
            //Arrange
            var id = Guid.NewGuid();

            EventStorage.Get(id, -1, "employees")
            .Returns(
                new List <Event>()
            {
                new EmployeeCreatedEvent(55, "Alejandro", "Molines", new DateTime(1981, 11, 28), "Developer")
            }
                );

            //Act
            var user = _eventRepository.Get <Employee>(id).Result;


            //Assert
            user.EmployeeId.Should().Be(55);
            user.FirstName.Should().Be("Alejandro");
            user.LastName.Should().Be("Molines");
            user.JobTitle.Should().Be("Developer");
            user.DateOfBirth.Should().Be(28.November(1981));
            EventStorage.Received(1).Get(id, -1, "employees");
        }
Exemplo n.º 14
0
 public EventStorageWriter(int maxSize, TimeSpan maxAgeBeforeDrop, EventStorage storage, int maxBatchSize = 2048)
 {
     _maxSize = maxSize;
     _maxAgeBeforeDrop = maxAgeBeforeDrop;
     _storage = storage;
     _maxBatchSize = maxBatchSize;
 }
Exemplo n.º 15
0
        public override async Task OnActivateAsync()
        {
            await base.OnActivateAsync();

            //如果失活之前已提交事务还没有Complete,则消耗信号量,防止产生新的事物
            if (Snapshot.Base.TransactionId != 0)
            {
                await TransactionSemaphore.WaitAsync();

                var waitingEvents = await EventStorage.GetList(GrainId, Snapshot.Base.TransactionStartTimestamp, Snapshot.Base.TransactionStartVersion, Snapshot.Base.Version);

                foreach (var evt in waitingEvents)
                {
                    WaitingForTransactionTransports.Add(new EventTransport <PrimaryKey>(evt, string.Empty, evt.StateId.ToString())
                    {
                        BytesTransport = new EventBytesTransport
                        {
                            EventType  = evt.Event.GetType().FullName,
                            GrainId    = GrainId,
                            EventBytes = Serializer.SerializeToBytes(evt.Event),
                            BaseBytes  = evt.Base.GetBytes()
                        }
                    });
                }
                CurrentTransactionId           = Snapshot.Base.TransactionId;
                CurrentTransactionStartVersion = Snapshot.Base.TransactionStartVersion;
            }
        }
        /// <summary>
        /// 异步发布事件,储存事件
        /// </summary>
        /// <typeparam name="TAggregationRoot"></typeparam>
        /// <param name="event"></param>
        /// <returns></returns>
        public async Task PublishEventAsync <TAggregationRoot>(TAggregationRoot @event) where TAggregationRoot : IAggregationRoot
        {
            var domainEventList = @event.UncommittedEvents.ToList();

            TryDapperConnection();
            using (var transaction = _connection.BeginTransaction())
            {
                if (domainEventList.Count > 0)
                {
                    foreach (var domainEvent in domainEventList)
                    {
                        EventStorage eventStorage = new EventStorage
                        {
                            Id = domainEvent.Id,
                            AggregateRootId   = domainEvent.AggregateRootId,
                            AggregateRootType = domainEvent.AggregateRootType,
                            CreateDateTime    = domainEvent.CreateDateTime,
                            Version           = domainEvent.Version,
                            EventData         = JsonConvert.SerializeObject(domainEvent)
                        };
                        var eventStorageSql = $"INSERT INTO EventStorageInfo(Id,AggregateRootId,AggregateRootType,CreateDateTime,Version,EventData) VALUES (@Id,@AggregateRootId,@AggregateRootType,@CreateDateTime,@Version,@EventData)";
                        await _connection.ExecuteAsync(eventStorageSql, eventStorage, transaction);

                        await _capPublisher.PublishAsync(domainEvent.GetRoutingKey(), domainEvent);
                    }
                }
                transaction.Commit();
                _connection.Close();
                @event.ClearEvents();
            }
        }
Exemplo n.º 17
0
        public override async Task OnActivateAsync()
        {
            await ReadSnapshotAsync();

            while (true)
            {
                var eventList = await EventStorage.GetListAsync(this.GrainId, this.State.Version, this.State.Version + 1000, this.State.VersionTime);

                foreach (var @event in eventList)
                {
                    @event.Event.Apply(this.State);
                    if ([email protected])
                    {
                        using (var ms = new MemoryStream())
                        {
                            Serializer.Serialize(ms, @event.Event);
                            await EventInsertAfterHandle(@event.Event, ms.ToArray());
                        }
                    }
                }
                if (eventList.Count < 1000)
                {
                    break;
                }
            }
            ;
        }
 void Start()
 {
     _eventStorage = EventStorage.Instance;
     _eventStorage.UserLocationDetermined.AddListener(_pleaseWork);
     _eventStorage.LocationClicked.AddListener(_show);
     _eventStorage.MapToDefault.AddListener(_hide);
 }
        internal static void setEnabled(Boolean enabled)
        {
            if (enabled && !isEnabled)
            {
                //Read events from storage
                eventsList = EventStorage.getEvents();

                if (eventsList.Count > 0)
                {
                    sendNextEvent();
                }

                isEnabled = true;
            }
            else if (!enabled && isEnabled)
            {
                //Stop current eventSender
                if (eventSender != null)
                {
                    eventSender.cancel();
                    eventSender = null;
                }

                //Store events to storage
                EventStorage.storeEvents(eventsList);
                eventsList = null;

                isEnabled = false;
            }
        }
Exemplo n.º 20
0
        protected async ValueTask Tell(IFullyEvent <PrimaryKey> @event)
        {
            if (Logger.IsEnabled(LogLevel.Trace))
            {
                Logger.LogTrace(LogEventIds.FollowEventProcessing, "Start event handling, grain Id = {0} and state version = {1},event type = {2} ,event = {3}", GrainId.ToString(), Snapshot.Version, @event.GetType().FullName, Serializer.SerializeToString(@event));
            }
            try
            {
                if (@event.Base.Version == Snapshot.Version + 1)
                {
                    var onEventDeliveredTask = OnEventDelivered(@event);
                    if (!onEventDeliveredTask.IsCompletedSuccessfully)
                    {
                        await onEventDeliveredTask;
                    }
                    Snapshot.FullUpdateVersion(@event.Base, GrainType);//更新处理完成的Version
                }
                else if (@event.Base.Version > Snapshot.Version)
                {
                    var eventList = await EventStorage.GetList(GrainId, Snapshot.StartTimestamp, Snapshot.Version + 1, @event.Base.Version - 1);

                    foreach (var evt in eventList)
                    {
                        var onEventDeliveredTask = OnEventDelivered(evt);
                        if (!onEventDeliveredTask.IsCompletedSuccessfully)
                        {
                            await onEventDeliveredTask;
                        }
                        Snapshot.FullUpdateVersion(evt.Base, GrainType);//更新处理完成的Version
                    }
                }
                if (@event.Base.Version == Snapshot.Version + 1)
                {
                    var onEventDeliveredTask = OnEventDelivered(@event);
                    if (!onEventDeliveredTask.IsCompletedSuccessfully)
                    {
                        await onEventDeliveredTask;
                    }
                    Snapshot.FullUpdateVersion(@event.Base, GrainType);//更新处理完成的Version
                }
                if (@event.Base.Version > Snapshot.Version)
                {
                    throw new EventVersionNotMatchStateException(GrainId.ToString(), GrainType, @event.Base.Version, Snapshot.Version);
                }
                await SaveSnapshotAsync();

                if (Logger.IsEnabled(LogLevel.Trace))
                {
                    Logger.LogTrace(LogEventIds.FollowEventProcessing, "Event Handling Completion, grain Id ={0} and state version = {1},event type = {2}", GrainId.ToString(), Snapshot.Version, @event.GetType().FullName);
                }
            }
            catch (Exception ex)
            {
                if (Logger.IsEnabled(LogLevel.Critical))
                {
                    Logger.LogCritical(LogEventIds.FollowEventProcessing, ex, "FollowGrain Event handling failed with Id = {0},event = {1}", GrainId.ToString(), Serializer.SerializeToString(@event));
                }
                throw;
            }
        }
Exemplo n.º 21
0
        public override async Task OnActivateAsync()
        {
            await base.OnActivateAsync();

            //如果失活之前已提交事务还没有Complete,则消耗信号量,防止产生新的事物
            if (Snapshot.Base is TxSnapshotBase <PrimaryKey> snapshotBase)
            {
                if (snapshotBase.TransactionId != 0)
                {
                    await TransactionSemaphore.WaitAsync();

                    var waitingEvents = await EventStorage.GetList(GrainId, snapshotBase.TransactionStartTimestamp, snapshotBase.TransactionStartVersion, Snapshot.Base.Version);

                    foreach (var evt in waitingEvents)
                    {
                        var evtType = evt.Event.GetType();
                        WaitingForTransactionTransports.Add(new EventTransport <PrimaryKey>(evt, string.Empty, evt.StateId.ToString())
                        {
                            BytesTransport = new EventBytesTransport(
                                TypeContainer.GetTypeCode(evtType),
                                GrainId,
                                evt.Base.GetBytes(),
                                Serializer.SerializeToUtf8Bytes(evt.Event, evtType)
                                )
                        });
                    }
                    CurrentTransactionId           = snapshotBase.TransactionId;
                    CurrentTransactionStartVersion = snapshotBase.TransactionStartVersion;
                }
            }
            else
            {
                throw new SnapshotNotSupportTxException(Snapshot.GetType());
            }
        }
Exemplo n.º 22
0
 private void CommandConfiguration()
 {
     Commands = new List <SessionCommand>
     {
         new BaseCommand("Name", new TextResponse($"Set event name{Emoji.Pointer}", ResponseStatus.Expect), r =>
         {
             Event.SetName(r.Command);
             return(new TextResponse(Emoji.CheckMark, ResponseStatus.Close));
         }),
         new BaseCommand("Description", new TextResponse($"Set event description{Emoji.Pointer}", ResponseStatus.Expect), r =>
         {
             Event.SetDescription(r.Command);
             return(new TextResponse(Emoji.CheckMark, ResponseStatus.Close));
         }),
         new SetDateTimeCommand("Start time", d => Event.SetStaringTime(d)),
         new SetDateTimeCommand("End time", d => Event.SetEndingTime(d)),
         new SetTimeSpanCommand("First Reminder", span => Event.SetFirstReminder(span)),
         new SetTimeSpanCommand("Second Reminder", span => Event.SetSecondReminder(span)),
         new BaseCommand("Exit", null, r =>
         {
             Event = null;
             return(new TextResponse("Exit", ResponseStatus.Abort));
         }, false),
         new BaseCommand("Save", null, r =>
         {
             if (Event.Name == null || Name.Length == 0)
             {
                 return(new TextResponse(Emoji.CrossMark + "Add event name", ResponseStatus.Exception));
             }
             EventStorage.Add(Event);
             return(new TextResponse(Emoji.CheckMark, ResponseStatus.Abort));
         }, false)
     }.ToDictionary(x => x.Name, x => x);
 }
 void Start()
 {
     Canvas.ForceUpdateCanvases();
     _initializeFirst();
     _eventStorage = EventStorage.Instance;
     _eventStorage.LocationClicked.AddListener(_switchToNavigation);
 }
Exemplo n.º 24
0
    // Use this for initialization
    void Start()
    {
#if UNITY_ANDROID || UNITY_IPHONE
        _eventStorage = EventStorage.Instance;
        _eventStorage.ConnectionEstablished.AddListener(_startGeolocation);
        _eventStorage.ConnectionTerminated.AddListener(_stopGeolocation);
#endif
    }
    // Use this for initialization
    void Start()
    {
        _eventStorage = EventStorage.Instance;

        _downloadAndInitializeEvents();

        _startEventPointerUpdate();
    }
Exemplo n.º 26
0
        private Plugin()
        {
            Icons            = new Dictionary <string, Image>();
            ItemTemplates    = new List <ItemTemplate>();
            ProjectTemplates = new List <ProjectTemplate>();

            Dependencies = new List <Library>();

            Events  = new EventStorage();
            Windows = new WindowCollection();
        }
Exemplo n.º 27
0
        private Plugin()
        {
            Icons = new Dictionary<string, Image>();
            ItemTemplates = new List<ItemTemplate>();
            ProjectTemplates = new List<ProjectTemplate>();

            Dependencies = new List<Library>();

            Events = new EventStorage();
            Windows = new WindowCollection();
        }
Exemplo n.º 28
0
 void Start()
 {
     _notificator  = UserNotificator.Instance;
     _eventStorage = EventStorage.Instance;
     _eventStorage.DropUserLoc.AddListener(_dropUserLocation);
     _eventStorage.LocationClicked.AddListener(_centralizeAt);
     _eventStorage.MapToDefault.AddListener(_dropCenterAndRefresh);
     _eventStorage.UserLocationDetermined.AddListener(_addUserLocationMarkerAndRefresh);
     _eventStorage.MapToUser.AddListener(_centerToUserAndRefresh);
     _eventStorage.OpenMaps.AddListener(_openGoogleMapsWithCurrentCenter);
     _initialize();
 }
Exemplo n.º 29
0
        protected virtual async ValueTask OnArchiveCompleted()
        {
            //开始执行事件清理逻辑
            var noCleareds = BriefArchiveList.Where(a => !a.EventIsCleared).ToList();

            if (noCleareds.Count >= ArchiveOptions.MaxSnapshotArchiveRecords)
            {
                var minArchive = noCleareds.FirstOrDefault();
                if (minArchive != default)
                {
                    //判断需要清理的event是否都被follow执行过
                    var versions = await Task.WhenAll(FollowUnit.GetAndSaveVersionFuncs().Select(func => func(Snapshot.Base.StateId, Snapshot.Base.Version)));

                    if (versions.All(v => v >= minArchive.EndVersion))
                    {
                        //清理归档对应的事件
                        await ArchiveStorage.EventIsClear(Snapshot.Base.StateId, minArchive.Id);

                        minArchive.EventIsCleared = true;
                        //如果快照的版本小于需要清理的最大事件版本号,则保存快照
                        if (SnapshotEventVersion < minArchive.EndVersion)
                        {
                            var saveTask = SaveSnapshotAsync(true);
                            if (!saveTask.IsCompletedSuccessfully)
                            {
                                await saveTask;
                            }
                        }
                        if (ArchiveOptions.DeleteEvents)
                        {
                            await EventStorage.DeleteStart(Snapshot.Base.StateId, minArchive.EndVersion, Snapshot.Base.StartTimestamp);
                        }
                        else
                        {
                            await ArchiveStorage.EventArichive(Snapshot.Base.StateId, minArchive.EndVersion, Snapshot.Base.StartTimestamp);
                        }
                        ClearedArchive = minArchive;
                        //只保留一个清理过事件的快照,其它的删除掉
                        var cleareds = BriefArchiveList.Where(a => a.EventIsCleared).OrderBy(a => a.Index).ToArray();
                        if (cleareds.Length > 1)
                        {
                            for (int i = 0; i < cleareds.Length - 1; i++)
                            {
                                await DeleteArchive(cleareds[i].Id);

                                BriefArchiveList.Remove(cleareds[i]);
                            }
                        }
                    }
                }
            }
        }
        public IEventRepository CreateEventRepository(IShardCalculator shardCalculator, IEventRepositoryColumnFamilyFullNames columnFamilies, IEventLogProfiler profiler, TimeSpan eventsTtl)
        {
            var eventLogPointerCreator = new EventLogPointerCreator();

            var remoteLockImplementation            = new CassandraRemoteLockImplementation(cassandraCluster, serializer, CassandraRemoteLockImplementationSettings.Default(columnFamilies.RemoteLock.KeyspaceName, columnFamilies.RemoteLock.ColumnFamilyName));
            var remoteLocker                        = new RemoteLocker(remoteLockImplementation, new RemoteLockerMetrics(columnFamilies.RemoteLock.KeyspaceName), logger);
            var eventLoggerAdditionalInfoRepository = new EventLoggerAdditionalInfoRepository(cassandraCluster, serializer, remoteLocker, columnFamilies.EventLogAdditionalInfo, columnFamilies.EventLog);
            var eventStorage                        = new EventStorage(columnFamilies.EventLog, eventLogPointerCreator, cassandraCluster, serializer);
            Func <IQueueRaker> createQueueRaker     = () => new QueueRaker(eventStorage, eventLoggerAdditionalInfoRepository, profiler, logger, eventsTtl);
            var eventLogger = new EventLogger(cassandraCluster, serializer, columnFamilies.EventLog, eventLogPointerCreator, createQueueRaker, eventLoggerAdditionalInfoRepository, profiler, logger);

            return(new EventRepository(eventTypeIdentifierProvider, eventLogger, shardCalculator, serializer));
        }
Exemplo n.º 31
0
        protected async Task Over()
        {
            if (Snapshot.Base.IsOver)
            {
                throw new StateIsOverException(Snapshot.Base.StateId.ToString(), GrainType);
            }
            if (Snapshot.Base.Version != Snapshot.Base.DoingVersion)
            {
                throw new StateInsecurityException(Snapshot.Base.StateId.ToString(), GrainType, Snapshot.Base.DoingVersion, Snapshot.Base.Version);
            }
            if (ArchiveOptions.On && ArchiveOptions.ArchiveEventOnOver)
            {
                var versions = await ObserverUnit.GetAndSaveVersion(Snapshot.Base.StateId, Snapshot.Base.Version);

                if (versions.Any(v => v < Snapshot.Base.Version))
                {
                    throw new ObserverNotCompletedException(GrainType.FullName, Snapshot.Base.StateId.ToString());
                }
            }
            Snapshot.Base.IsOver   = true;
            Snapshot.Base.IsLatest = true;
            if (SnapshotEventVersion != Snapshot.Base.Version)
            {
                var saveTask = SaveSnapshotAsync(true, true);
                if (!saveTask.IsCompletedSuccessfully)
                {
                    await saveTask;
                }
            }
            else
            {
                await SnapshotStorage.Over(Snapshot.Base.StateId, true);
            }
            if (ArchiveOptions.On && ArchiveOptions.ArchiveEventOnOver)
            {
                await ArchiveStorage.DeleteAll(Snapshot.Base.StateId);

                if (ArchiveOptions.EventArchiveType == EventArchiveType.Delete)
                {
                    await EventStorage.DeleteStart(Snapshot.Base.StateId, Snapshot.Base.Version, Snapshot.Base.StartTimestamp);
                }
                else
                {
                    await ArchiveStorage.EventArichive(Snapshot.Base.StateId, Snapshot.Base.Version, Snapshot.Base.StartTimestamp);
                }
            }
            else
            {
                await ArchiveStorage.Over(Snapshot.Base.StateId, true);
            }
        }
Exemplo n.º 32
0
 public async Task Tell(W message)
 {
     var type = MessageTypeMapping.GetType(message.TypeCode);
     if (type != null)
     {
         using (var ems = new MemoryStream(message.BinaryBytes))
         {
             var @event = Serializer.Deserialize(type, ems) as IEventBase<K>;
             if (@event != null)
             {
                 if (@event.Version == this.State.Version + 1)
                 {
                     await OnExecution(@event);
                     this.State.IncrementDoingVersion();//标记将要处理的Version
                     EventHandle.Apply(this.State, @event);
                     this.State.UpdateVersion(@event);//更新处理完成的Version
                     await OnExecuted(@event);
                     await SaveSnapshotAsync();
                 }
                 else if (@event.Version > this.State.Version)
                 {
                     var eventList = await EventStorage.GetListAsync(this.GrainId, this.State.Version, @event.Version);
                     foreach (var item in eventList)
                     {
                         await OnExecution(@event);
                         this.State.IncrementDoingVersion();//标记将要处理的Version
                         EventHandle.Apply(this.State, @event);
                         this.State.UpdateVersion(@event);//更新处理完成的Version
                         await OnExecuted(@event);
                         await SaveSnapshotAsync();
                     }
                 }
                 if (@event.Version == this.State.Version + 1)
                 {
                     await OnExecution(@event);
                     this.State.IncrementDoingVersion();//标记将要处理的Version
                     EventHandle.Apply(this.State, @event);
                     this.State.UpdateVersion(@event);//更新处理完成的Version
                     await OnExecuted(@event);
                     await SaveSnapshotAsync();
                 }
                 if (@event.Version > this.State.Version)
                 {
                     throw new Exception($"Event version of the error,Type={ThisType.FullName},StateId={this.GrainId.ToString()},StateVersion={this.State.Version},EventVersion={@event.Version}");
                 }
             }
         }
     }
 }
Exemplo n.º 33
0
        private async Task FullActive()
        {
            while (true)
            {
                var eventList = await EventStorage.GetList(GrainId, Snapshot.StartTimestamp, Snapshot.Version + 1, Snapshot.Version + ConfigOptions.NumberOfEventsPerRead);

                if (EventConcurrentProcessing)
                {
                    await Task.WhenAll(eventList.Select(@event =>
                    {
                        var task = OnEventDelivered(@event);
                        if (!task.IsCompletedSuccessfully)
                        {
                            return(task.AsTask());
                        }
                        else
                        {
                            return(Task.CompletedTask);
                        }
                    }));

                    var lastEvt = eventList.Last();
                    Snapshot.UnsafeUpdateVersion(lastEvt.Base);
                }
                else
                {
                    foreach (var @event in eventList)
                    {
                        Snapshot.IncrementDoingVersion(GrainType);//标记将要处理的Version
                        var task = OnEventDelivered(@event);
                        if (!task.IsCompletedSuccessfully)
                        {
                            await task;
                        }
                        Snapshot.UpdateVersion(@event.Base, GrainType);//更新处理完成的Version
                    }
                }
                var saveTask = SaveSnapshotAsync();
                if (!saveTask.IsCompletedSuccessfully)
                {
                    await saveTask;
                }
                if (eventList.Count < ConfigOptions.NumberOfEventsPerRead)
                {
                    break;
                }
            }
            ;
        }
Exemplo n.º 34
0
        public ConcurrentEventStore(EventStorage storage, IEnumerable<EventSet> preload, Action<int> notifier_target, Func<object, string> discriminator_factory)
        {
            _storage = storage;
            _discriminatorFactory = discriminator_factory;
            Refresh();
            _notifierTarget = notifier_target ?? (_ => { });

            _streamversions =
                storage.All.SelectMany(_ => _.Envelopes)
                    .GroupBy(_ => _.Header.Stream)
                    .Select(_ => new {Stream = _.Key, Version = _.Max(a => a.Header.StreamVersion)})
                    .ToDictionary(_ => _.Stream, _ => _.Version);

            Preload(preload ?? new List<EventSet>());
        }
Exemplo n.º 35
0
        public EventStorageTest()
        {
            var fake = new Faker();

            _eventDto = new EventDto
            {
                Name        = fake.Random.Words(),
                Description = fake.Lorem.Paragraph(),
                StartDate   = fake.Date.Recent().ToString(),
                FinishDate  = fake.Date.Recent().ToString()
            };

            _eventRepositoryMock = new Mock <IEventRepository>();
            _eventStorage        = new EventStorage(_eventRepositoryMock.Object);
        }
Exemplo n.º 36
0
 protected virtual void SetUpPerTest(EventStorage storage)
 {
 }
Exemplo n.º 37
0
        private QueueStorage getQueueStorage(string connectionStringName, EventStorage eventStorage)
        {
            if (connectionStringName == "inmem")
            {
                if (eventStorage is InMemoryEventStorage == false)
                    throw new ArgumentException(
                        "In memory queue storage can't be used without in memory event storage.", "eventStorage");

                return new InMemoryQueueStorage((InMemoryEventStorage) eventStorage);
            }
            else
            {
                var connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
                var queueStorage = new SqlQueueStorage(connectionString);
                return queueStorage;
            }
        }
Exemplo n.º 38
0
 public ConcurrentEventStore(EventStorage storage, IEnumerable<EventSet> preload)
     : this(storage, preload, null)
 {
 }
Exemplo n.º 39
0
 public ConcurrentEventStore(EventStorage storage)
     : this(storage, null, null)
 {
 }
Exemplo n.º 40
0
 public SinglethreadEventStore(EventStorage storage)
     : this(storage, null, null)
 {
 }
Exemplo n.º 41
0
 protected virtual void TearDownPerTest(EventStorage storage)
 {
 }
Exemplo n.º 42
0
        private static void Main(string[] args)
        {
            var eventStorage = new EventStorage();
            var query = new BookStateQuery();

            DomainEvents.RegisterHandler(() => new BookStateHandler(query));
            DomainEvents.RegisterHandler(() => new LateReturnNotifier());

            var bookId = BookId.NewBookId();

            using (var session = new Session(eventStorage))
            {
                var books = new BookRepository();
                var book = new Book(bookId,
                    "The Lord of the Rings",
                    "0-618-15396-9");
                books.Add(book);

                session.SubmitChanges();
            }

            ShowBooks(query);

            using (var session = new Session(eventStorage))
            {
                var books = new BookRepository();
                var book = books[bookId];
                book.Lend("Alice",
                    new DateTime(2009, 11, 2),
                    TimeSpan.FromDays(14));

                session.SubmitChanges();
            }

            ShowBooks(query);

            using (var session = new Session(eventStorage))
            {
                var books = new BookRepository();
                var book = books[bookId];
                book.Return(new DateTime(2009, 11, 8));

                session.SubmitChanges();
            }

            ShowBooks(query);

            using (var session = new Session(eventStorage))
            {
                var books = new BookRepository();
                var book = books[bookId];
                book.Lend("Bob",
                    new DateTime(2009, 11, 9),
                    TimeSpan.FromDays(14));

                session.SubmitChanges();
            }

            ShowBooks(query);

            using (var session = new Session(eventStorage))
            {
                var books = new BookRepository();
                var book = books[bookId];
                book.Return(new DateTime(2010, 03, 1));
                session.SubmitChanges();
            }

            ShowBooks(query);
        }
Exemplo n.º 43
0
 public SinglethreadEventStore(EventStorage storage, Action<int> notifier_target)
     : this(storage, null, notifier_target)
 {
 }
Exemplo n.º 44
0
 public void PerTestSetup()
 {
     _storage = GetStorage();
     SetUpPerTest(_storage);
 }
Exemplo n.º 45
0
        /// <summary>
        /// Helper function to get all of the event handlers for the Freezable and
        /// place them in the calledHandlers list.
        /// <param name="calledHandlers"> Where to place the change handlers for the Freezable. </param>
        /// </summary>
        private void GetHandlers(ref EventStorage calledHandlers)
        {
            if (Freezable_UsingSingletonHandler)
            {
                if (calledHandlers == null)
                {
                    calledHandlers = GetEventStorage();
                }

                calledHandlers.Add(SingletonHandler);
            }
            else if (Freezable_UsingHandlerList)
            {
                if (calledHandlers == null)
                {
                    calledHandlers = GetEventStorage();
                }

                FrugalObjectList<EventHandler> handlers = HandlerList;

                for (int i = 0, count = handlers.Count; i < count; i++)
                {
                    calledHandlers.Add(handlers[i]);
                }
            }
        }
Exemplo n.º 46
0
        /// <summary>
        /// Gets an EventStorage object to be used to cache event handlers and sets it to be
        /// in use.
        /// </summary>
        /// <returns>
        /// An EventStorage object to be used to cache event handlers that is set
        /// to be in use.
        /// </returns>
        private EventStorage GetEventStorage()
        {
            EventStorage eventStorage = CachedEventStorage;

            // if we reach a case where EventStorage is being used - meaning FireChanged called
            // a handler that in turn called FireChanged which is probably a bad thing to have
            // happen - just allocate a new one that won't be cached.
            if (eventStorage.InUse)
            {
                // use the cached EventStorage's physical size as an estimate of how big we
                // need to be in order to avoid growing the newly created EventStorage
                int cachedPhysicalSize = eventStorage.PhysicalSize;
                eventStorage = new EventStorage(cachedPhysicalSize);
            }

            eventStorage.InUse = true;

            return eventStorage;
        }
Exemplo n.º 47
0
        public EventStorage SwitchStorage(EventStorage new_storage)
        {
            var lock_taken = false;
            try
            {
                if (!_lock.IsHeldByCurrentThread) _lock.Enter(ref lock_taken);

                var old = _storage;
                _storage = new_storage;
                Refresh();
                return old;
            }
            finally
            {
                if (lock_taken) _lock.Exit(true);
            }
        }
Exemplo n.º 48
0
        /// <summary>
        /// This method walks up the context graph recursively, gathering all change handlers that
        /// exist at or above the current node, placing them in calledHandlers.  While
        /// performing the walk it will also call OnChanged and InvalidateSubProperty on all
        /// DO/DP pairs encountered on the walk.
        /// </summary>
        private void GetChangeHandlersAndInvalidateSubProperties(ref EventStorage calledHandlers)
        {
            this.OnChanged();

            Freezable contextAsFreezable;

            if (Freezable_UsingSingletonContext)
            {
                DependencyObject context = SingletonContext;

                contextAsFreezable = context as Freezable;
                if (contextAsFreezable != null)
                {
                    contextAsFreezable.GetChangeHandlersAndInvalidateSubProperties(ref calledHandlers);
                }

                if (SingletonContextProperty != null)
                {
                    context.InvalidateSubProperty(SingletonContextProperty);
                }
            }
            else if (Freezable_UsingContextList)
            {
                FrugalObjectList<FreezableContextPair> contextList = ContextList;

                DependencyObject lastDO = null;

                int deadRefs = 0;
                for (int i = 0, count = contextList.Count; i < count; i++)
                {
                    FreezableContextPair currentContext = contextList[i];

                    DependencyObject currentDO = (DependencyObject)currentContext.Owner.Target;
                    if (currentDO != null)
                    {
                        // we only want to grab change handlers once per context reference - so skip
                        // until we find a new one
                        if (currentDO != lastDO)
                        {
                            contextAsFreezable = currentDO as Freezable;
                            if (contextAsFreezable != null)
                            {
                                contextAsFreezable.GetChangeHandlersAndInvalidateSubProperties(ref calledHandlers);
                            }

                            lastDO = currentDO;
                        }

                        if (currentContext.Property != null)
                        {
                            currentDO.InvalidateSubProperty(currentContext.Property);
                        }
                    }
                    else
                    {
                        ++deadRefs;
                    }
                }

                PruneContexts(contextList, deadRefs);
            }


            GetHandlers(ref calledHandlers);
        }
Exemplo n.º 49
0
 public ConcurrentEventStore(EventStorage storage, Action<int> notifier_target)
     : this(storage, null, notifier_target)
 {
 }
Exemplo n.º 50
0
 public SinglethreadEventStore(EventStorage storage, IEnumerable<EventSet> preload, Action<int> notifier_target)
     : this(storage, preload, notifier_target, null)
 {
 }
Exemplo n.º 51
0
 public ConcurrentEventStore(EventStorage storage, IEnumerable<EventSet> preload, Action<int> notifier_target)
     : this(storage, preload, notifier_target, null)
 {
 }
Exemplo n.º 52
0
 public SinglethreadEventStore(EventStorage storage, IEnumerable<EventSet> preload)
     : this(storage, preload, null)
 {
 }
Exemplo n.º 53
0
 public EventsInjector(EventStorage storage)
 {
     _storage = storage;
 }
Exemplo n.º 54
0
 protected virtual void SetUpPerTest(QueueStorage storage, EventStorage eventStorage)
 {
 }