예제 #1
0
 public async Task ConcurrentOnNext(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)
             {
                 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
         {
             if (Logger.IsEnabled(LogLevel.Information))
             {
                 Logger.LogInformation("Receive non-event messages, grain Id = {0} ,message type = {1}", GrainId.ToString(), transport.EventTypeCode);
             }
         }
     }
 }
예제 #2
0
        protected async Task <bool> ConcurrentTxRaiseEvent(
            long transactionId,
            Func <Snapshot <PrimaryKey, SnapshotType>, Func <IEvent, EventUID, Task>, Task> handler)
        {
            var taskSource = new TaskCompletionSource <bool>();

            if (transactionId <= 0)
            {
                throw new TxIdException();
            }
            var writeTask = ConcurrentChannel.WriteAsync(new ConcurrentTransport <Snapshot <PrimaryKey, SnapshotType> >(transactionId, handler, taskSource));

            if (!writeTask.IsCompletedSuccessfully)
            {
                await writeTask;
            }
            if (!writeTask.Result)
            {
                var ex = new ChannelUnavailabilityException(GrainId.ToString(), GrainType);
                Logger.LogError(ex, ex.Message);
                throw ex;
            }
            return(await taskSource.Task);
        }