Esempio n. 1
0
        /// <inheritdoc cref="SendAsync{TQueue, TMessage}(TMessage)"/>
        public static Task SendAsync <TQueue>(ICommandMessage <TQueue> message, Type messageType)
            where TQueue : ISendCommandQueue, new()
        {
            RockLogger.Log.Debug(RockLogDomains.Core, "Send Message Async: {@message} Message Type: {1}", message, messageType);

            if (!IsReady())
            {
                ExceptionLogService.LogException($"A message was sent before the message bus was ready: {RockMessage.GetLogString( message )}");
                return(Task.CompletedTask);
            }

            var queue    = RockQueue.Get <TQueue>();
            var endpoint = _transportComponent.GetSendEndpoint(_bus, queue.NameForConfiguration);

            message.SenderNodeName = NodeName;

            // NOTE: Use Task.Run to wrap an async instead of directly using async, otherwise async will get an exception if it isn't done before the HttpContext is disposed.
            return(Task.Run(async() =>
            {
                await endpoint.Send(message, messageType, context =>
                {
                    context.TimeToLive = RockQueue.GetTimeToLive(queue);
                });
            }));
        }
Esempio n. 2
0
        /// <summary>
        /// Synchronizes the rebuild status.
        /// </summary>
        private void SyncRebuildStatus()
        {
            if (RockQueue.IsExecuting <StreakTypeRebuildTransaction>())
            {
                var progress = RockQueue.CurrentlyExecutingTransactionProgress;

                if (progress.HasValue)
                {
                    ShowBlockNotification(nbEditModeMessage, string.Format(
                                              "A streak type rebuild is running and is {0}% complete. Please check back later.",
                                              progress.Value));
                }
                else
                {
                    ShowBlockNotification(nbEditModeMessage, "A streak type rebuild is currently running. Please check back later.");
                }

                btnRebuild.Enabled = false;
            }
            else if (RockQueue.IsInQueue <StreakTypeRebuildTransaction>())
            {
                ShowBlockNotification(nbEditModeMessage, "A streak type rebuild is currently queued. Please check back later.");
                btnRebuild.Enabled = false;
            }
            else
            {
                btnRebuild.Enabled = true;
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Gets the log string.
        /// </summary>
        /// <typeparam name="TQueue">The type of the queue.</typeparam>
        /// <param name="message">The message.</param>
        /// <returns></returns>
        public static string GetLogString <TQueue>(IRockMessage <TQueue> message)
            where TQueue : IRockQueue, new()
        {
            var messageJson = message.ToJson();
            var queueName   = RockQueue.Get <TQueue>().Name;
            var messageType = message.GetType().FullName;

            return($"Queue: {queueName}\nMessageType: {messageType}\n{messageJson}");
        }
Esempio n. 4
0
 /// <summary>
 /// Drains the transaction queue.
 /// </summary>
 public static void DrainTransactionQueue()
 {
     // process the transaction queue
     if (!Global.QueueInUse)
     {
         Global.QueueInUse = true;
         RockQueue.Drain((ex) => LogError(ex, null));
         Global.QueueInUse = false;
     }
 }
Esempio n. 5
0
        /// <summary>
        /// Publishes the message.
        /// </summary>
        /// <typeparam name="TQueue">The type of the queue.</typeparam>
        /// <param name="message">The message.</param>
        /// <param name="messageType">Type of the message.</param>
        public static async Task PublishAsync <TQueue>(IEventMessage <TQueue> message, Type messageType)
            where TQueue : IPublishEventQueue, new()
        {
            if (!IsReady())
            {
                ExceptionLogService.LogException(new BusException($"A message was published before the message bus was ready: {RockMessage.GetLogString( message )}"));
                return;
            }

            message.SenderNodeName = NodeName;

            await _bus.Publish(message, messageType, context =>
            {
                context.TimeToLive = RockQueue.GetTimeToLive <TQueue>();
            });
        }
Esempio n. 6
0
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            var queueKey = PageParameter(PageParameterKey.QueueKey);
            var queue    = RockQueue.Get(queueKey);

            if (queue == null)
            {
                SetVisible(false);
                return;
            }

            var viewModels = RockConsumer.GetConsumerTypes()
                             .Where(ct => RockConsumer.GetQueue(ct) == queue)
                             .Select(ct =>
            {
                var messageType = RockConsumer.GetMessageType(ct);

                return(new ConsumerViewModel
                {
                    ConsumerName = Reflection.GetFriendlyName(ct),
                    QueueName = queue == null ? null : queue.Name,
                    MessageName = Reflection.GetFriendlyName(messageType)
                });
            })
                             .AsQueryable();

            // Sort the query based on the column that was selected to be sorted
            var sortProperty = gList.SortProperty;

            if (gList.AllowSorting && sortProperty != null)
            {
                viewModels = viewModels.Sort(sortProperty);
            }
            else
            {
                viewModels = viewModels
                             .OrderBy(vm => vm.QueueName)
                             .ThenBy(vm => vm.ConsumerName);
            }

            gList.DataSource = viewModels.ToList();
            gList.DataBind();
        }
Esempio n. 7
0
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            gList.DataKeyNames = new string[] { "QueueTypeName" };

            var viewModels = RockQueue.GetQueueTypes()
                             .Select(qt =>
            {
                var queue = RockQueue.Get(qt);

                var queueType =
                    queue is ISendCommandQueue ? "Command" :
                    queue is IPublishEventQueue ? "Event" :
                    "Unknown";

                return(new QueueViewModel
                {
                    TimeToLiveSeconds = queue.TimeToLiveSeconds,
                    QueueTypeName = qt.FullName,
                    QueueName = queue.Name,
                    QueueType = queueType,
                    RatePerDay = queue.StatLog.MessagesConsumedLastDay,
                    RatePerHour = queue.StatLog.MessagesConsumedLastHour,
                    RatePerMinute = queue.StatLog.MessagesConsumedLastMinute
                });
            })
                             .AsQueryable();

            // Sort the query based on the column that was selected to be sorted
            var sortProperty = gList.SortProperty;

            if (gList.AllowSorting && sortProperty != null)
            {
                viewModels = viewModels.Sort(sortProperty);
            }
            else
            {
                viewModels = viewModels.OrderBy(vm => vm.QueueName);
            }

            gList.DataSource = viewModels.ToList();
            gList.DataBind();
        }
Esempio n. 8
0
        /// <inheritdoc cref="PublishAsync{TQueue, TMessage}(TMessage)"/>
        public static Task PublishAsync <TQueue>(IEventMessage <TQueue> message, Type messageType)
            where TQueue : IPublishEventQueue, new()
        {
            if (!IsReady())
            {
                ExceptionLogService.LogException(new BusException($"A message was published before the message bus was ready: {RockMessage.GetLogString( message )}"));
                return(Task.CompletedTask);
            }

            message.SenderNodeName = NodeName;

            // NOTE: Use Task.Run to wrap an async instead of directly using async, otherwise async will get an exception if it isn't done before the HttpContext is disposed.
            return(Task.Run(async() =>
            {
                await _bus.Publish(message, messageType, context =>
                {
                    context.TimeToLive = RockQueue.GetTimeToLive <TQueue>();
                });
            }));
        }
Esempio n. 9
0
        /// <summary>
        /// Sends the command message.
        /// </summary>
        /// <typeparam name="TQueue">The type of the queue.</typeparam>
        /// <param name="message">The message.</param>
        /// <param name="messageType">Type of the message.</param>
        public static async Task SendAsync <TQueue>(ICommandMessage <TQueue> message, Type messageType)
            where TQueue : ISendCommandQueue, new()
        {
            RockLogger.Log.Debug(RockLogDomains.Core, "Send Message Async: {@message} Message Type: {1}", message, messageType);

            if (!IsReady())
            {
                ExceptionLogService.LogException($"A message was sent before the message bus was ready: {RockMessage.GetLogString( message )}");
                return;
            }

            var queue    = RockQueue.Get <TQueue>();
            var endpoint = _transportComponent.GetSendEndpoint(_bus, queue.NameForConfiguration);

            message.SenderNodeName = NodeName;

            await endpoint.Send(message, messageType, context =>
            {
                context.TimeToLive = RockQueue.GetTimeToLive(queue);
            });
        }
Esempio n. 10
0
 /// <summary>
 /// Gets an instance of the queue.
 /// </summary>
 /// <returns></returns>
 public static IRockQueue GetQueue()
 {
     return RockQueue.Get<TQueue>();
 }
Esempio n. 11
0
        /// <summary>
        /// Gets the queue for the message type.
        /// </summary>
        /// <param name="messageType">Type of the message.</param>
        /// <returns></returns>
        public static IRockQueue GetQueue(Type messageType)
        {
            var queueType = GetQueueType(messageType);

            return(RockQueue.Get(queueType));
        }