Dispatch() public method

public Dispatch ( Event @event ) : System.Threading.Tasks.Task
@event CQRSMicroservices.Framework.Event
return System.Threading.Tasks.Task
    /// <summary>
    /// This is the main entry point for your service's partition replica. 
    /// RunAsync executes when the primary replica for this partition has write status.
    /// </summary>
    /// <param name="cancellationToken">Canceled when Service Fabric terminates this partition's replica.</param>
    protected override async Task RunAsync(CancellationToken cancellationToken)
    {
      var queue = await StateManager.GetOrAddAsync<IReliableQueue<string>>("eventBusQueue");

      // We use the ServiceFabricEventBus as our way of dispatching in this service.
      // The class has all the registered builders and can locate them through the ServiceClient.

      var eventBus = new ServiceFabricEventBus();
      Handlers.QueryModelBuilders.ToList().ForEach(eventBus.RegisterBuilder);
      var deserializer = new Deserializer();

      var count = (int)await queue.GetCountAsync();
      if(count > 0)
      {
        _semaphore.Release(count);
      }

      while(true)
      {
        cancellationToken.ThrowIfCancellationRequested();

        using(ITransaction tx = StateManager.CreateTransaction())
        {
          ConditionalResult<string> dequeueReply = await queue.TryDequeueAsync(tx);
          if(dequeueReply.HasValue)
          {
            string message = dequeueReply.Value;
            await eventBus.Dispatch(deserializer.CreateEvent(JObject.Parse(message)));
            await tx.CommitAsync();
          }
        }

        await _semaphore.WaitAsync(cancellationToken);
      }
    }
Example #2
0
        /// <summary>
        /// This is the main entry point for your service's partition replica.
        /// RunAsync executes when the primary replica for this partition has write status.
        /// </summary>
        /// <param name="cancellationToken">Canceled when Service Fabric terminates this partition's replica.</param>
        protected override async Task RunAsync(CancellationToken cancellationToken)
        {
            var queue = await StateManager.GetOrAddAsync <IReliableQueue <string> >("eventBusQueue");

            // We use the ServiceFabricEventBus as our way of dispatching in this service.
            // The class has all the registered builders and can locate them through the ServiceClient.

            var eventBus = new ServiceFabricEventBus();

            Handlers.QueryModelBuilders.ToList().ForEach(eventBus.RegisterBuilder);
            var deserializer = new Deserializer();

            var count = (int)await queue.GetCountAsync();

            if (count > 0)
            {
                _semaphore.Release(count);
            }

            while (true)
            {
                cancellationToken.ThrowIfCancellationRequested();

                using (ITransaction tx = StateManager.CreateTransaction())
                {
                    ConditionalResult <string> dequeueReply = await queue.TryDequeueAsync(tx);

                    if (dequeueReply.HasValue)
                    {
                        string message = dequeueReply.Value;
                        await eventBus.Dispatch(deserializer.CreateEvent(JObject.Parse(message)));

                        await tx.CommitAsync();
                    }
                }

                await _semaphore.WaitAsync(cancellationToken);
            }
        }