/// <summary> /// Registers a Service or Actor <paramref name="reference"/> as subscriber for messages of type <paramref name="messageTypeName"/> /// </summary> /// <param name="reference">Reference to the Service or Actor to register.</param> /// <param name="messageTypeName">Full type name of message object.</param> /// <returns></returns> public async Task SubscribeAsync(ReferenceWrapper reference, string messageTypeName) { await WaitForInitializeAsync(CancellationToken.None); var myDictionary = await TimeoutRetryHelper.Execute((token, state) => StateManager.GetOrAddAsync <IReliableDictionary <string, BrokerServiceState> >(messageTypeName)); await TimeoutRetryHelper.ExecuteInTransaction(StateManager, async (tx, token, state) => { var queueName = CreateQueueName(reference, messageTypeName); Func <string, BrokerServiceState> addValueFactory = key => { var newState = new BrokerServiceState(messageTypeName); var subscriber = new Reference(reference, queueName); newState = BrokerServiceState.AddSubscriber(newState, subscriber); return(newState); }; Func <string, BrokerServiceState, BrokerServiceState> updateValueFactory = (key, current) => { var subscriber = new Reference(reference, queueName); var newState = BrokerServiceState.AddSubscriber(current, subscriber); return(newState); }; await myDictionary.AddOrUpdateAsync(tx, Subscribers, addValueFactory, updateValueFactory); await CreateQueueAsync(tx, queueName); _queues.AddOrUpdate(queueName, reference, (key, old) => reference); ServiceEventSourceMessage($"Registered subscriber: {reference.Name}"); await BrokerEventsManager.OnSubscribedAsync(queueName, reference, messageTypeName); }, cancellationToken : CancellationToken.None); }
/// <summary> /// Registers a Service or Actor <paramref name="reference"/> as subscriber for messages of type <paramref name="messageTypeName"/> /// </summary> /// <param name="reference">Reference to the Service or Actor to register.</param> /// <param name="messageTypeName">Full type name of message object.</param> /// <param name="isOrdered"></param> /// <returns></returns> public async Task SubscribeAsync(ReferenceWrapper reference, string messageTypeName, bool isOrdered = true) { await WaitForInitializeAsync(CancellationToken.None); var brokerState = await TimeoutRetryHelper.Execute((token, state) => StateManager.GetOrAddAsync <IReliableDictionary <string, BrokerServiceState> >(messageTypeName)); await TimeoutRetryHelper.ExecuteInTransaction(StateManager, async (tx, token, state) => { var subscriptionDetails = new SubscriptionDetails(reference, messageTypeName, isOrdered); var subscription = await _subscriptionFactory.CreateAsync(tx, subscriptionDetails); await brokerState.AddOrUpdateSubscription(tx, Subscribers, subscriptionDetails); _subscriptions.AddOrUpdate(subscriptionDetails.QueueName, subscription, (key, old) => subscription); ServiceEventSourceMessage($"Registered subscriber: {reference.Name}"); await _brokerEventsManager.OnSubscribedAsync(subscriptionDetails.QueueName, reference, messageTypeName); }, cancellationToken : CancellationToken.None); }