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()); }
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}"); } } } } }
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}"); } } } } }
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); } } } } }
//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); } } }
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))); } } }
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))); } } }
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()); }
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(); } }
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(); } }