private void OnPackageArrived(TcpTypedConnection <byte[]> connection, TcpPackage package) { if (package.Command != TcpCommand.ReadEventCompleted) { _worker.SignalWorkerFailed( error: string.Format("Worker {0} received unexpected command. Expected: {1}, received: {2}.", _worker.Name, TcpCommand.ReadEventCompleted, package.Command)); return; } var dto = package.Data.Deserialize <ClientMessageDto.ReadEventCompleted>(); var corrId = new Guid(dto.CorrelationId); WorkerItem workItem; if (!_worker.TryGetWorkItem(corrId, out workItem)) { _worker.SignalWorkerFailed( error: string.Format("Worker {0} received unexpected CorrId: {1}, no event with such CorrId is in progress.", _worker.Name, corrId)); return; } var readResult = (SingleReadResult)dto.Result; switch (readResult) { case SingleReadResult.Success: var cmp = workItem.Event.VerifyThat(new Event(workItem.Event.Event.EventId, dto.EventType, false, dto.Data, dto.Metadata), dto.EventNumber); switch (cmp.Status) { case ComparisonStatus.Success: if (_worker.TryRemoveWorkItem(workItem)) { _worker.NotifyItemProcessed(workItem); } break; case ComparisonStatus.Fail: _worker.SignalWorkerFailed( error: string.Format("Worker {0} received invalid event. Details : {1}.", _worker, cmp.Description)); _worker.TryRemoveWorkItem(workItem); break; default: throw new ArgumentOutOfRangeException(); } break; case SingleReadResult.NotFound: case SingleReadResult.NoStream: case SingleReadResult.StreamDeleted: _worker.SignalWorkerFailed( error: string.Format("Worker {0} received unexpected response : {1}.", _worker.Name, readResult)); _worker.TryRemoveWorkItem(workItem); break; default: throw new ArgumentOutOfRangeException(); } }
private void OnPackageArrived(TcpTypedConnection <byte[]> connection, TcpPackage package) { if (package.Command != TcpCommand.WriteEventsCompleted) { _worker.SignalWorkerFailed( error: string.Format("Worker {0} received unexpected command. Expected: {1}, received: {2}.", _worker.Name, TcpCommand.WriteEventsCompleted, package.Command)); return; } var dto = package.Data.Deserialize <ClientMessageDto.WriteEventsCompleted>(); var corrId = new Guid(dto.CorrelationId); WorkerItem workItem; if (!_worker.TryGetWorkItem(corrId, out workItem)) { _worker.SignalWorkerFailed( error: string.Format( "Worker {0} received unexpected CorrId: {1}, no event with such CorrId is in progress.", _worker.Name, corrId)); return; } switch ((OperationErrorCode)dto.ErrorCode) { case OperationErrorCode.Success: { if (_worker.TryRemoveWorkItem(workItem)) { _worker.NotifyItemProcessed(workItem); } break; } case OperationErrorCode.PrepareTimeout: case OperationErrorCode.CommitTimeout: case OperationErrorCode.ForwardTimeout: _worker.Retry(workItem); break; case OperationErrorCode.WrongExpectedVersion: if (workItem.Event.ExpectedVersion == ExpectedVersion.Any) { if (workItem.Event.ShouldBeVersion != 1) { _worker.SignalWorkerFailed( error: string.Format("Worker {0} received WrongExpectedVersion for event with " + "ExpectedVersion = EventNumber.Any and ShouldBeVersion = 1, " + "which shouldn't happen ever!", _worker.Name)); _worker.TryRemoveWorkItem(workItem); return; } } _worker.Retry(workItem); break; case OperationErrorCode.StreamDeleted: case OperationErrorCode.InvalidTransaction: _worker.SignalWorkerFailed( error: string.Format("Worker {0} received unexpected OperationErrorCode: {1}.", _worker.Name, (OperationErrorCode)dto.ErrorCode)); _worker.TryRemoveWorkItem(workItem); break; default: throw new ArgumentOutOfRangeException(); } }