示例#1
0
        public virtual async ValueTask OnReplicaMessage(ReplicaMessage message, CancellationToken cancellationToken)
        {
            if (message.PublisherId != Publisher.Id)
            {
                await OnUnsupportedMessage(message, cancellationToken).ConfigureAwait(false);

                return;
            }
            var publicationId = message.PublicationId;
            var publication   = Publisher.TryGet(publicationId);

            if (publication == null)
            {
                await OnUnsupportedMessage(message, cancellationToken).ConfigureAwait(false);

                return;
            }
            if (Subscriptions.TryGetValue(publicationId, out var subscriptionProcessor))
            {
                goto subscriptionExists;
            }
            lock (Lock) {
                // Double check locking
                if (Subscriptions.TryGetValue(publicationId, out subscriptionProcessor))
                {
                    goto subscriptionExists;
                }

                subscriptionProcessor = PublisherImpl.SubscriptionProcessorFactory.Create(
                    PublisherImpl.SubscriptionProcessorGeneric,
                    publication, Channel, PublisherImpl.SubscriptionExpirationTime,
                    PublisherImpl.Clock, LoggerFactory);
                Subscriptions[publicationId] = subscriptionProcessor;
            }
            subscriptionProcessor.Run()
            .ContinueWith(_ => Unsubscribe(publication, default), CancellationToken.None)
            .Ignore();
subscriptionExists:
            await subscriptionProcessor.IncomingChannel.Writer
            .WriteAsync(message, cancellationToken).ConfigureAwait(false);
        }
 public abstract ValueTask OnMessageAsync(ReplicaMessage message, CancellationToken cancellationToken);