예제 #1
0
 public async Task OnNext(Immutable <byte[]> bytes)
 {
     var(success, transport) = EventBytesTransport.FromBytesWithNoId(bytes.Value);
     if (success)
     {
         var data = Serializer.Deserialize(TypeContainer.GetType(transport.EventTypeCode), transport.EventBytes);
         if (data is IEvent @event)
         {
             var eventBase = EventBase.FromBytes(transport.BaseBytes);
             if (eventBase.Version > Snapshot.Version)
             {
                 if (concurrent)
                 {
                     var input = new AsyncInputEvent <IFullyEvent <PrimaryKey>, bool>(new FullyEvent <PrimaryKey>
                     {
                         StateId = GrainId,
                         Base    = eventBase,
                         Event   = @event
                     });
                     var writeTask = ConcurrentChannel.WriteAsync(input);
                     if (!writeTask.IsCompletedSuccessfully)
                     {
                         await writeTask;
                     }
                     if (!writeTask.Result)
                     {
                         var ex = new ChannelUnavailabilityException(GrainId.ToString(), GrainType);
                         Logger.LogError(ex, ex.Message);
                         throw ex;
                     }
                     await input.TaskSource.Task;
                 }
                 else
                 {
                     var tellTask = Tell(new FullyEvent <PrimaryKey>
                     {
                         StateId = GrainId,
                         Base    = eventBase,
                         Event   = @event
                     });
                     if (!tellTask.IsCompletedSuccessfully)
                     {
                         await tellTask;
                     }
                 }
             }
         }
         else
         {
             if (Logger.IsEnabled(LogLevel.Information))
             {
                 Logger.LogInformation("Receive non-event messages, grain Id = {0} ,message type = {1}", GrainId.ToString(), transport.EventTypeCode);
             }
         }
     }
 }
예제 #2
0
파일: EventStorage.cs 프로젝트: chi8708/Ray
 public Task <bool> Append(IFullyEvent <PrimaryKey> fullyEvent, EventBytesTransport bytesTransport, string unique)
 {
     return(Task.Run(async() =>
     {
         var wrap = new AsyncInputEvent <BatchAppendTransport <PrimaryKey>, bool>(new BatchAppendTransport <PrimaryKey>(fullyEvent, bytesTransport, unique));
         var writeTask = mpscChannel.WriteAsync(wrap);
         if (!writeTask.IsCompletedSuccessfully)
         {
             await writeTask;
         }
         return await wrap.TaskSource.Task;
     }));
 }
예제 #3
0
 public Task Append<Input>(string unitName, Commit<Input> commit) where Input : class, new()
 {
     return Task.Run(async () =>
     {
         var wrap = new AsyncInputEvent<AppendInput, bool>(new AppendInput
         {
             UnitName = unitName,
             TransactionId = commit.TransactionId,
             Data = serializer.Serialize(commit.Data),
             Status = commit.Status
         });
         var writeTask = mpscChannel.WriteAsync(wrap);
         if (!writeTask.IsCompletedSuccessfully)
             await writeTask;
         await wrap.TaskSource.Task;
     });
 }