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);