コード例 #1
0
        public void Handle(ClientMessage.ConnectToPersistentSubscription message)
        {
            if (!_started)
            {
                return;
            }
            var streamAccess = _readIndex.CheckStreamAccess(
                message.EventStreamId, StreamAccessType.Read, message.User);

            if (!streamAccess.Granted)
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.AccessDenied));
                return;
            }

            List <PersistentSubscription> subscribers;

            if (!_subscriptionTopics.TryGetValue(message.EventStreamId, out subscribers))
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.NotFound));
                return;
            }

            var key = BuildSubscriptionGroupKey(message.EventStreamId, message.SubscriptionId);
            PersistentSubscription subscription;

            if (!_subscriptionsById.TryGetValue(key, out subscription))
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.NotFound));
                return;
            }

            if (subscription.HasReachedMaxClientCount)
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.SubscriberMaxCountReached));
                return;
            }

            Log.Debug("New connection to persistent subscription {subscriptionKey} by {connectionId}", key,
                      message.ConnectionId);
            var lastEventNumber   = _readIndex.GetStreamLastEventNumber(message.EventStreamId);
            var lastCommitPos     = _readIndex.LastIndexedPosition;
            var subscribedMessage =
                new ClientMessage.PersistentSubscriptionConfirmation(key, message.CorrelationId, lastCommitPos,
                                                                     lastEventNumber);

            message.Envelope.ReplyWith(subscribedMessage);
            var name = message.User == null ? "anonymous" : message.User.Identity.Name;

            subscription.AddClient(message.CorrelationId, message.ConnectionId, message.ConnectionName, message.Envelope,
                                   message.AllowedInFlightMessages, name, message.From);
        }
コード例 #2
0
        private ClientMessage.ReadEventCompleted ReadEvent(ClientMessage.ReadEvent msg)
        {
            using (HistogramService.Measure(_readerReadHistogram)) {
                try {
                    var access = _readIndex.CheckStreamAccess(msg.EventStreamId, StreamAccessType.Read, msg.User);
                    if (!access.Granted)
                    {
                        return(NoData(msg, ReadEventResult.AccessDenied));
                    }

                    var result = _readIndex.ReadEvent(msg.EventStreamId, msg.EventNumber);
                    var record = result.Result == ReadEventResult.Success && msg.ResolveLinkTos
                                                ? ResolveLinkToEvent(result.Record, msg.User, null)
                                                : ResolvedEvent.ForUnresolvedEvent(result.Record);
                    if (record == null)
                    {
                        return(NoData(msg, ReadEventResult.AccessDenied));
                    }
                    if ((result.Result == ReadEventResult.NoStream ||
                         result.Result == ReadEventResult.NotFound) &&
                        result.OriginalStreamExists &&
                        SystemStreams.IsSystemStream(msg.EventStreamId))
                    {
                        return(NoData(msg, ReadEventResult.Success));
                    }

                    return(new ClientMessage.ReadEventCompleted(msg.CorrelationId, msg.EventStreamId, result.Result,
                                                                record.Value, result.Metadata, access.Public, null));
                } catch (Exception exc) {
                    Log.ErrorException(exc, "Error during processing ReadEvent request.");
                    return(NoData(msg, ReadEventResult.Error, exc.Message));
                }
            }
        }
コード例 #3
0
        private ClientMessage.ReadEventCompleted ReadEvent(ClientMessage.ReadEvent msg)
        {
            try
            {
                var access = _readIndex.CheckStreamAccess(msg.EventStreamId, StreamAccessType.Read, msg.User);
                if (!access.Granted)
                {
                    return(NoData(msg, ReadEventResult.AccessDenied));
                }

                var result = _readIndex.ReadEvent(msg.EventStreamId, msg.EventNumber);
                var record = result.Result == ReadEventResult.Success && msg.ResolveLinkTos
                                     ? ResolveLinkToEvent(result.Record, msg.User)
                                     : new ResolvedEvent(result.Record);
                if (record == null)
                {
                    return(NoData(msg, ReadEventResult.AccessDenied));
                }

                return(new ClientMessage.ReadEventCompleted(msg.CorrelationId, msg.EventStreamId, result.Result,
                                                            record.Value, result.Metadata, access.Public, null));
            }
            catch (Exception exc)
            {
                Log.ErrorException(exc, "Error during processing ReadEvent request.");
                return(NoData(msg, ReadEventResult.Error, exc.Message));
            }
        }
コード例 #4
0
        public void Handle(ClientMessage.CreatePersistentSubscription message)
        {
            if (!_started)
            {
                return;
            }
            var key = BuildSubscriptionGroupKey(message.EventStreamId, message.GroupName);

            Log.Debug("Creating persistent subscription {0}", key);
            //TODO revisit for permissions. maybe make admin only?
            var streamAccess = _readIndex.CheckStreamAccess(SystemStreams.SettingsStream, StreamAccessType.Write, message.User);

            if (!streamAccess.Granted)
            {
                message.Envelope.ReplyWith(new ClientMessage.CreatePersistentSubscriptionCompleted(message.CorrelationId,
                                                                                                   ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult.AccessDenied,
                                                                                                   "You do not have permissions to create streams"));
                return;
            }
            if (_subscriptionsById.ContainsKey(key))
            {
                message.Envelope.ReplyWith(new ClientMessage.CreatePersistentSubscriptionCompleted(message.CorrelationId,
                                                                                                   ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult.AlreadyExists,
                                                                                                   "Group '" + message.GroupName + "' already exists."));
                return;
            }

            if (message.EventStreamId == null || message.EventStreamId == "" || message.EventStreamId == "$all")
            {
                message.Envelope.ReplyWith(new ClientMessage.CreatePersistentSubscriptionCompleted(message.CorrelationId,
                                                                                                   ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult.Fail,
                                                                                                   "Bad stream name."));
                return;
            }
            if (!_consumerStrategyRegistry.ValidateStrategy(message.NamedConsumerStrategy))
            {
                message.Envelope.ReplyWith(new ClientMessage.CreatePersistentSubscriptionCompleted(message.CorrelationId,
                                                                                                   ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult.Fail,
                                                                                                   string.Format("Consumer strategy {0} does not exist.", message.NamedConsumerStrategy)));
                return;
            }

            CreateSubscriptionGroup(message.EventStreamId,
                                    message.GroupName,
                                    message.ResolveLinkTos,
                                    message.StartFrom,
                                    message.RecordStatistics,
                                    message.MaxRetryCount,
                                    message.LiveBufferSize,
                                    message.BufferSize,
                                    message.ReadBatchSize,
                                    ToTimeout(message.CheckPointAfterMilliseconds),
                                    message.MinCheckPointCount,
                                    message.MaxCheckPointCount,
                                    message.MaxSubscriberCount,
                                    message.NamedConsumerStrategy,
                                    ToTimeout(message.MessageTimeoutMilliseconds)
                                    );

            Log.Debug("New persistent subscription {0}", key);
            _config.Updated   = DateTime.Now;
            _config.UpdatedBy = message.User.Identity.Name;
            _config.Entries.Add(new PersistentSubscriptionEntry
            {
                Stream                = message.EventStreamId,
                Group                 = message.GroupName,
                ResolveLinkTos        = message.ResolveLinkTos,
                CheckPointAfter       = message.CheckPointAfterMilliseconds,
                ExtraStatistics       = message.RecordStatistics,
                HistoryBufferSize     = message.BufferSize,
                LiveBufferSize        = message.LiveBufferSize,
                MaxCheckPointCount    = message.MaxCheckPointCount,
                MinCheckPointCount    = message.MinCheckPointCount,
                MaxRetryCount         = message.MaxRetryCount,
                ReadBatchSize         = message.ReadBatchSize,
                MaxSubscriberCount    = message.MaxSubscriberCount,
                MessageTimeout        = message.MessageTimeoutMilliseconds,
                NamedConsumerStrategy = message.NamedConsumerStrategy,
                StartFrom             = message.StartFrom
            });
            SaveConfiguration(() => message.Envelope.ReplyWith(new ClientMessage.CreatePersistentSubscriptionCompleted(message.CorrelationId,
                                                                                                                       ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult.Success, "")));
        }