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();
            }
        }
Esempio n. 2
0
        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();
            }
        }