/// <summary> /// Subscribes an action to be executed for every action posted to the channel. Action should be thread safe. /// Action may be invoked on multiple threads. /// </summary> /// <param name="subscriber"></param> /// <param name="subscriptions"></param> /// <returns></returns> private IDisposable SubscribeOnProducerThreads(Action <T> subscriber, ISubscriptionRegistry subscriptions) { _subscribers += subscriber; var unsubscriber = new Unsubscriber <T>(subscriber, this, subscriptions); subscriptions.RegisterSubscription(unsubscriber); return(unsubscriber); }
public ISubscriptionTag Build(ISubscriptionRegistry registry) { var serializerFactory = new AmqpSerializerFactory(this.Serializers); var amqpMessageBuilder = new AmqpMessageBuilder(serializerFactory, propertyBuilder, router); var subscriptionTags = this.subscriptions .Select(createSubsriptionTag => createSubsriptionTag(this.ConnectionFactory, amqpMessageBuilder, registry)) .ToList(); return(new CompositeSubscriptionTag(Guid.NewGuid().ToString(), subscriptionTags)); }
private IDisposable Subscribe(Action action, ISubscriptionRegistry subscriptionRegistery) { Monitor.Enter(syncRoot); try { this.Add(action); } finally { Monitor.Exit(syncRoot); } var subscriptionDisposable = new EventSubscriptionDisposable(action, this, subscriptionRegistery); subscriptionRegistery.RegisterSubscription(subscriptionDisposable); return(subscriptionDisposable); }
public Unsubscriber(Action <T> receiver, Channel <T> channel, ISubscriptionRegistry subscriptions) { _receiver = receiver; _channel = channel; _subscriptions = subscriptions; }
public EventSubscriptionDisposable(Action action, AsyncEvent asyncEvent, ISubscriptionRegistry subscriptionRegistry) { this.action = action; this.asyncEvent = asyncEvent; this.subscriptionRegistry = subscriptionRegistry; }