예제 #1
0
        public async Task <List <EventInfo <K> > > GetListAsync(K stateId, string typeCode, Int64 startVersion, Int64 endVersion, DateTime?startTime = null)
        {
            var   collectionList = mongoAttr.GetCollectionList(mongoStorage, mongoStorage.Config.SysStartTime, startTime);
            var   list           = new List <EventInfo <K> >();
            Int64 readVersion    = 0;

            foreach (var collection in collectionList)
            {
                var filterBuilder = Builders <BsonDocument> .Filter;
                var filter        = filterBuilder.Eq("StateId", stateId) & filterBuilder.Eq("TypeCode", typeCode) & filterBuilder.Gt("Version", startVersion);
                var cursor        = await mongoStorage.GetCollection <BsonDocument>(mongoAttr.EventDataBase, collection.Name).FindAsync <BsonDocument>(filter, cancellationToken: new CancellationTokenSource(3000).Token);

                foreach (var document in cursor.ToEnumerable())
                {
                    var type      = MessageTypeMapping.GetType(typeCode);
                    var data      = document["Data"].AsByteArray;
                    var eventInfo = new EventInfo <K>();
                    eventInfo.IsComplete = document["IsComplete"].AsBoolean;
                    using (MemoryStream ms = new MemoryStream(data))
                    {
                        var @event = Serializer.Deserialize(type, ms) as IEventBase <K>;
                        eventInfo.Event = @event;
                    }
                    if (readVersion <= endVersion)
                    {
                        list.Add(eventInfo);
                    }
                }
                if (readVersion >= endVersion)
                {
                    break;
                }
            }
            return(list.OrderBy(e => e.Event.Version).ToList());
        }
예제 #2
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}");
                 }
             }
         }
     }
 }
예제 #3
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);

                            @event.Apply(State);
                            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);

                                item.Event.Apply(State);
                                await OnExecuted(@event);
                                await SaveSnapshotAsync();
                            }
                        }
                        if (@event.Version == this.State.Version + 1)
                        {
                            await OnExecution(@event);

                            @event.Apply(State);
                            await OnExecuted(@event);
                            await SaveSnapshotAsync();
                        }
                        if (@event.Version > this.State.Version)
                        {
                            throw new Exception($"ESReplicaGrain出现严重BUG,Type={ThisType.FullName},StateId={this.GrainId.ToString()},StateVersion={this.State.Version},EventVersion={@event.Version}");
                        }
                    }
                }
            }
        }
예제 #4
0
        public async Task Tell(W msg)
        {
            var type = MessageTypeMapping.GetType(msg.TypeCode);

            if (type != null)
            {
                using (var ems = new MemoryStream(msg.BinaryBytes))
                {
                    var message = Serializer.Deserialize(type, ems);
                    if (message != null)
                    {
                        if (!outsideMsgTypecodeList.Contains(msg.TypeCode))
                        {
                            if (message is IEvent @event)
                            {
                                if (@event.Version == this.State.Version + 1)
                                {
                                    await EventExcute(@event);
                                }
                                else if (@event.Version > this.State.Version)
                                {
                                    while (true)
                                    {
                                        var eventList = await EventStorage.GetListAsync(this.GrainId, this.State.Version, this.State.Version + 1000, this.State.VersionTime);

                                        foreach (var item in eventList)
                                        {
                                            await EventExcute(item.Event);
                                        }
                                        if (this.State.Version >= @event.Version)
                                        {
                                            break;
                                        }
                                    }
                                    ;
                                }
                            }
                        }
                        else if (message is IMessage value)
                        {
                            await NotEventMsgExcute(value);
                        }
                    }
                }
            }
        }
예제 #5
0
        //Create the MessageTypeMappings for this contract
        private void CreateMessageTypeMappings(ServiceContract item)
        {
            MessageTypeMapping    mtm;
            IDictionaryEnumerator enumerator = this.MessageTypeMappings.GetEnumerator();

            while (enumerator.MoveNext())
            {
                if (!item.MessageTypeMappings.Contains(enumerator.Key.ToString()))
                {
                    mtm = new MessageTypeMapping(item, enumerator.Key.ToString());

                    mtm.MessageSource = (MessageSource)enumerator.Value;

                    item.MessageTypeMappings.Add(mtm);
                }
            }
        }
예제 #6
0
        public Task Notice(byte[] bytes)
        {
            var serializer = Global.IocProvider.GetService <ISerializer>();

            using (var ms = new MemoryStream(bytes))
            {
                var msg  = serializer.Deserialize <TMessageWrapper>(ms);
                var type = MessageTypeMapping.GetType(msg.TypeCode);
                if (type == null)
                {
                    throw new Exception($"TypeCode for { msg.TypeCode } type does not exist");
                }
                using (var ems = new MemoryStream(msg.BinaryBytes))
                {
                    return(this.Notice(bytes, msg, serializer.Deserialize(type, ems)));
                }
            }
        }
예제 #7
0
        public Task Notice(byte[] data)
        {
            var serializer = Global.IocProvider.GetService <ISerializer>();

            using (var ms = new MemoryStream(data))
            {
                var msg  = serializer.Deserialize <TMessageWrapper>(ms);
                var type = MessageTypeMapping.GetType(msg.TypeCode);
                if (type == null)
                {
                    throw new Exception("TypeCode为" + msg.TypeCode + "的Type不存在");
                }
                using (var ems = new MemoryStream(msg.BinaryBytes))
                {
                    return(this.Notice(data, msg, serializer.Deserialize(type, ems)));
                }
            }
        }
예제 #8
0
파일: EventStorage.cs 프로젝트: zmk523/Ray
        public async Task <List <EventInfo <K> > > GetListAsync(K stateId, string typeCode, Int64 startVersion, Int64 endVersion, DateTime?startTime = null)
        {
            var tableList = await tableInfo.GetTableList(startTime);

            var   list        = new List <EventInfo <K> >();
            Int64 readVersion = 0;

            using (var conn = tableInfo.CreateConnection())
            {
                foreach (var table in tableList)
                {
                    var sql = $"SELECT typecode,data,IsComplete from {table.Name} WHERE stateid=@StateId and typecode=@TypeCode and version>@Start and version<=@End";

                    var sqlEventList = await conn.QueryAsync <SqlEvent>(sql, new { StateId = stateId, TypeCode = typeCode, Start = startVersion, End = endVersion });

                    foreach (var sqlEvent in sqlEventList)
                    {
                        var type      = MessageTypeMapping.GetType(sqlEvent.TypeCode);
                        var eventInfo = new EventInfo <K>();
                        eventInfo.IsComplete = sqlEvent.IsComplete;
                        using (var ms = new MemoryStream(sqlEvent.Data))
                        {
                            var @event = Serializer.Deserialize(type, ms) as IEventBase <K>;
                            readVersion     = @event.Version;
                            eventInfo.Event = @event;
                        }
                        if (readVersion <= endVersion)
                        {
                            list.Add(eventInfo);
                        }
                    }
                    if (readVersion >= endVersion)
                    {
                        break;
                    }
                }
            }
            return(list.OrderBy(e => e.Event.Version).ToList());
        }
예제 #9
0
        //Create the MessageTypeMappings for this contract
        private void CreateMessageTypeMappings(ServiceContract item)
        {
            MessageTypeMapping mtm;
            IDictionaryEnumerator enumerator = this.MessageTypeMappings.GetEnumerator();
            while (enumerator.MoveNext())
            {
                if (!item.MessageTypeMappings.Contains(enumerator.Key.ToString()))
                {
                    mtm = new MessageTypeMapping(item, enumerator.Key.ToString());

                    mtm.MessageSource = (MessageSource)enumerator.Value;

                    item.MessageTypeMappings.Add(mtm);
                }
            }
        }
예제 #10
0
        internal static void DeploySsbObj(object obj, string svrName, string dbName, SsbEnum ssbType, bool isEdit)
        {
            Server               svr  = CreateServer(svrName, null, null);
            Database             db   = svr.Databases[dbName];
            ServiceBroker        sb   = db.ServiceBroker;
            MessageType          mt   = null;
            ServiceContract      sc   = null;
            ServiceQueue         q    = null;
            BrokerService        serv = null;
            ServiceRoute         rt   = null;
            RemoteServiceBinding bind = null;

            try {
                switch (ssbType)
                {
                case SsbEnum.MessageType:
                    MessageType mtNew = new MessageType();
                    mtNew.Parent = sb;
                    mt           = (MessageType)obj;
                    mtNew.Name   = mt.Name;
                    mtNew.MessageTypeValidation = mt.MessageTypeValidation;
                    if (mt.MessageTypeValidation == MessageTypeValidation.XmlSchemaCollection)
                    {
                        mtNew.ValidationXmlSchemaCollection = mt.ValidationXmlSchemaCollection;
                    }

                    if (isEdit)
                    {
                        mtNew.Alter();
                    }
                    else
                    {
                        mtNew.Create();
                    }

                    break;

                case SsbEnum.Contract:
                    ServiceContract scNew = new ServiceContract();
                    sc           = (ServiceContract)obj;
                    scNew.Parent = sb;
                    scNew.Name   = sc.Name;
                    foreach (MessageTypeMapping mtm in sc.MessageTypeMappings)
                    {
                        if (!sb.MessageTypes.Contains(mtm.Name))
                        {
                            ServiceBroker sbParent = sc.Parent;
                            MessageType   mtp      = sbParent.MessageTypes[mtm.Name];
                            DeploySsbObj(mtp, svrName, dbName, SsbEnum.MessageType, false);
                        }

                        MessageTypeMapping mtmNew = new MessageTypeMapping();
                        mtmNew.Name          = mtm.Name;
                        mtmNew.Parent        = scNew;
                        mtmNew.MessageSource = mtm.MessageSource;
                        scNew.MessageTypeMappings.Add(mtmNew);
                    }

                    if (isEdit)
                    {
                        scNew.Alter();
                    }
                    else
                    {
                        scNew.Create();
                    }

                    break;

                case SsbEnum.Queu:
                    q        = (ServiceQueue)obj;
                    q.Parent = sb;

                    if (isEdit)
                    {
                        q.Alter();
                    }
                    else
                    {
                        q.Create();
                    }

                    break;

                case SsbEnum.Service:
                    serv        = (BrokerService)obj;
                    serv.Parent = sb;

                    if (isEdit)
                    {
                        serv.Alter();
                    }
                    else
                    {
                        serv.Create();
                    }

                    break;

                case SsbEnum.Route:
                    rt        = (ServiceRoute)obj;
                    rt.Parent = sb;

                    if (isEdit)
                    {
                        rt.Alter();
                    }
                    else
                    {
                        rt.Create();
                    }

                    break;

                case SsbEnum.RemoteBinding:
                    bind        = (RemoteServiceBinding)obj;
                    bind.Parent = sb;

                    if (isEdit)
                    {
                        bind.Alter();
                    }
                    else
                    {
                        bind.Create();
                    }

                    break;
                }
            }
            catch (FailedOperationException e) {
                string err = string.Format("{0}", e.InnerException);
                //throw;
            }
            catch (Exception ex) {
                string errx = string.Format("{0}", ex.InnerException);
            }

            finally {
                svr.ConnectionContext.Disconnect();
            }
        }
예제 #11
0
파일: smo.cs 프로젝트: nberglund/ssbadmin
        internal static void DeploySsbObj(object obj, string svrName, string dbName, SsbEnum ssbType, bool isEdit)
        {
            Server svr = CreateServer(svrName, null, null);
              Database db = svr.Databases[dbName];
              ServiceBroker sb = db.ServiceBroker;
              MessageType mt = null;
              ServiceContract sc = null;
              ServiceQueue q = null;
              BrokerService serv = null;
              ServiceRoute rt = null;
              RemoteServiceBinding bind = null;

              try {
            switch (ssbType) {
              case SsbEnum.MessageType:
            MessageType mtNew = new MessageType();
            mtNew.Parent = sb;
            mt = (MessageType)obj;
            mtNew.Name = mt.Name;
            mtNew.MessageTypeValidation = mt.MessageTypeValidation;
            if (mt.MessageTypeValidation == MessageTypeValidation.XmlSchemaCollection)
              mtNew.ValidationXmlSchemaCollection = mt.ValidationXmlSchemaCollection;

            if (isEdit)
              mtNew.Alter();
            else
              mtNew.Create();

            break;

              case SsbEnum.Contract:
            ServiceContract scNew = new ServiceContract();
            sc = (ServiceContract)obj;
            scNew.Parent = sb;
            scNew.Name = sc.Name;
            foreach (MessageTypeMapping mtm in sc.MessageTypeMappings) {
              if (!sb.MessageTypes.Contains(mtm.Name)) {
                ServiceBroker sbParent = sc.Parent;
                MessageType mtp = sbParent.MessageTypes[mtm.Name];
                DeploySsbObj(mtp, svrName, dbName, SsbEnum.MessageType, false);
              }

              MessageTypeMapping mtmNew = new MessageTypeMapping();
              mtmNew.Name = mtm.Name;
              mtmNew.Parent = scNew;
              mtmNew.MessageSource = mtm.MessageSource;
              scNew.MessageTypeMappings.Add(mtmNew);

            }

            if (isEdit)
              scNew.Alter();
            else
              scNew.Create();

            break;

              case SsbEnum.Queu:
            q = (ServiceQueue)obj;
            q.Parent = sb;

            if (isEdit)
              q.Alter();
            else
              q.Create();

            break;

              case SsbEnum.Service:
            serv = (BrokerService)obj;
            serv.Parent = sb;

            if (isEdit)
              serv.Alter();
            else
              serv.Create();

            break;

              case SsbEnum.Route:
            rt = (ServiceRoute)obj;
            rt.Parent = sb;

            if (isEdit)
              rt.Alter();
            else
              rt.Create();

            break;

              case SsbEnum.RemoteBinding:
            bind = (RemoteServiceBinding)obj;
            bind.Parent = sb;

            if (isEdit)
              bind.Alter();
            else
              bind.Create();

            break;

            }
              }
              catch (FailedOperationException e) {
            string err = string.Format("{0}", e.InnerException);
            //throw;
              }
              catch (Exception ex) {
            string errx = string.Format("{0}", ex.InnerException);

              }

              finally {
            svr.ConnectionContext.Disconnect();
              }
        }