Esempio n. 1
0
        public ActionResult Receive()
        {
            // create a messaging factory configured to use a ManagedServiceIdentityTokenProvider
            MessagingFactory messagingFactory = CreateMessagingFactoryWithMsiTokenProvider();

            // create a queue client using the queue name supplied by the web.config
            QueueClient queueClient = messagingFactory.CreateQueueClient(ServiceBusQueue);

            // request a readily available message (with a very short wait)
            BrokeredMessage msg = queueClient.Receive(TimeSpan.FromSeconds(1));

            var messageInfo = new ServiceBusMessageInfo();

            if (msg != null)
            {
                messageInfo.MessageReceived = $"Seq#:{msg.SequenceNumber} data:{Encoding.UTF8.GetString(msg.GetBody<byte[]>())}{Environment.NewLine}";
            }
            else
            {
                messageInfo.MessageReceived = "<no messages in queue>";
            }

            queueClient.Close();
            messagingFactory.Close();

            return(View("Index", messageInfo));
        }
        /// <summary>
        /// Получить информацию о сообщениях, которые есть, но еще не отправлены указанному клиенту.
        /// </summary>
        /// <param name="clientId">Идентификатор клиента.</param>
        /// <param name="messageTypeId">Идентификатор типа сообщения.</param>
        /// <param name="groupName">Имя группы сообщения.</param>
        /// <param name="maxCount">Максимальное количество возвращаемых записей. Если равно 0, возвращается информация о всех имеющихся сообщениях.</param>
        /// <returns>Информация о сообщениях. Записи отсортированы в планируемом порядке отправки.</returns>
        public IEnumerable <ServiceBusMessageInfo> GetMessagesInfo(string clientId, string messageTypeId, string groupName, int maxCount = 0)
        {
            var queueName = _namingManager.GetClientQueueName(clientId, messageTypeId);
            IEnumerable <Queue> queues       = _managementClient.GetQueuesAsync().Result;
            IEnumerable <Queue> clientQueues = queues.Where(x => x.Name.StartsWith(queueName));

            List <ServiceBusMessageInfo> rmqMessagesInfo = new List <ServiceBusMessageInfo>();

            foreach (Queue clientQueue in clientQueues)
            {
                var messages = _managementClient.GetMessagesFromQueueAsync(clientQueue, new GetMessagesCriteria(clientQueue.Messages, Ackmodes.ack_requeue_true)).Result;
                foreach (var message in messages)
                {
                    // TODO: Исправить считывание групп.
                    if (message.Properties.Headers.Where(pr => pr.Key.StartsWith("__gruop" + groupName)).ToArray().Length != 0)
                    {
                        ServiceBusMessageInfo msg = new ServiceBusMessageInfo
                        {
                            // TODO: Добавить заполнение других свойств.
                            MessageTypeID = _namingManager.GetMessageType(message.RoutingKey),
                        };

                        rmqMessagesInfo.Add(msg);
                    }
                }

                if (maxCount > 0 && rmqMessagesInfo.Count >= maxCount)
                {
                    rmqMessagesInfo = rmqMessagesInfo.Take(maxCount).ToList();
                    break;
                }
            }

            return(rmqMessagesInfo);
        }
        /// <summary>
        /// Получить информацию о сообщениях, которые есть, но еще не отправлены указанному клиенту.
        /// </summary>
        /// <param name="clientId">Идентификатор клиента.</param>
        /// <param name="messageTypeId">Идентификатор типа сообщений.</param>
        /// <param name="maxCount">Максимальное количество возвращаемых записей. Если равно 0, возвращается информация о всех имеющихся сообщениях.</param>
        /// <returns>Информация о сообщениях. Записи отсортированы в планируемом порядке отправки.</returns>
        public IEnumerable <ServiceBusMessageInfo> GetMessagesInfo(string clientId, string messageTypeId, int maxCount = 0)
        {
            var queueName = _namingManager.GetClientQueueName(clientId, messageTypeId);
            IEnumerable <Queue> queues       = _managementClient.GetQueuesAsync().Result;
            IEnumerable <Queue> clientQueues = queues.Where(x => x.Name.StartsWith(queueName));

            List <ServiceBusMessageInfo> rmqMessagesInfo = new List <ServiceBusMessageInfo>();

            foreach (Queue clientQueue in clientQueues)
            {
                var messages = _managementClient.GetMessagesFromQueueAsync(clientQueue, new GetMessagesCriteria(clientQueue.Messages, Ackmodes.ack_requeue_true)).Result;
                foreach (var message in messages)
                {
                    ServiceBusMessageInfo msg = new ServiceBusMessageInfo
                    {
                        // TODO: Добавить заполнение других свойств.
                        MessageTypeID = messageTypeId,
                    };

                    rmqMessagesInfo.Add(msg);
                }

                if (maxCount > 0 && rmqMessagesInfo.Count >= maxCount)
                {
                    rmqMessagesInfo = rmqMessagesInfo.Take(maxCount).ToList();
                    break;
                }
            }

            return(rmqMessagesInfo);
        }
        /// <summary>
        /// Получить информацию о сообщениях, которые есть, но еще не отправлены указанному клиенту.
        /// </summary>
        /// <param name="clientId">Идентификатор клиента.</param>
        /// <param name="maxCount">Максимальное количество возвращаемых записей. Если равно 0, возвращается информация о всех имеющихся сообщениях.</param>
        /// <returns>Информация о сообщениях. Записи отсортированы в планируемом порядке отправки.</returns>
        public virtual IEnumerable <ServiceBusMessageInfo> GetMessagesInfo(string clientId, int maxCount = 0)
        {
            Guid clientPk = ServiceHelper.ConvertClientIdToPrimaryKey(clientId, _dataService, _statistics);

            LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Message), Message.Views.MessageLightView);

            if (maxCount > 0)
            {
                lcs.ReturnTop = maxCount;
            }

            lcs.LimitFunction = _langDef.GetFunction(_langDef.funcEQ, new VariableDef(_langDef.GuidType, Information.ExtractPropertyPath <Message>(x => x.Recipient)), clientPk);

            lcs.ColumnsSort = new[]
            {
                new ColumnsSortDef(Information.ExtractPropertyPath <Message>(x => x.Priority), SortOrder.Desc),
                new ColumnsSortDef(Information.ExtractPropertyPath <Message>(x => x.ReceivingTime), SortOrder.Asc)
            };

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            DataObject[] messages = _dataService.LoadObjects(lcs);

            stopwatch.Stop();
            long time = stopwatch.ElapsedMilliseconds;

            _statistics.NotifyAvgTimeSql(null, (int)time, "BaseSendingManager.GetMessagesInfo(string clientId) load messages.");

            ServiceBusMessageInfo[] esbMessages = new ServiceBusMessageInfo[messages.Length];
            for (int i = 0; i < messages.Length; i++)
            {
                var msg = (Message)messages[i];

                esbMessages[i] = new ServiceBusMessageInfo
                {
                    ID            = msg.__PrimaryKey.ToString(),
                    MessageTypeID = msg.MessageType.ID,
                    FormingTime   = msg.ReceivingTime,
                    Priority      = msg.Priority
                };
            }

            return(esbMessages);
        }
        /// <summary>
        /// Получить информацию о сообщениях, которые есть, но еще не отправлены указанному клиенту.
        /// </summary>
        /// <param name="clientId">Идентификатор клиента.</param>
        /// <param name="messageTypeId">Идентификатор типа сообщений.</param>
        /// <param name="tags">Теги, которые должно содержать сообщение.</param>
        /// <param name="maxCount">Максимальное количество возвращаемых записей. Если равно 0, возвращается информация о всех имеющихся сообщениях.</param>
        /// <returns>Информация о сообщениях. Записи отсортированы в планируемом порядке отправки.</returns>
        public IEnumerable <ServiceBusMessageInfo> GetMessagesInfo(string clientId, string messageTypeId, string[] tags, int maxCount = 0)
        {
            var queueName = _namingManager.GetClientQueueName(clientId, messageTypeId);
            IEnumerable <Queue> queues       = _managementClient.GetQueuesAsync().Result;
            IEnumerable <Queue> clientQueues = queues.Where(x => x.Name.StartsWith(queueName));

            List <ServiceBusMessageInfo> rmqMessagesInfo = new List <ServiceBusMessageInfo>();

            foreach (Queue clientQueue in clientQueues)
            {
                var messages = _managementClient.GetMessagesFromQueueAsync(clientQueue, new GetMessagesCriteria(clientQueue.Messages, Ackmodes.ack_requeue_true)).Result;
                foreach (var message in messages)
                {
                    var haveAllTags = true;
                    foreach (string tag in tags)
                    {
                        var headerTag = message.Properties.Headers.Where(pr => pr.Key.StartsWith(_converter.GetTagPropertiesPrefix(tag)));
                        if (headerTag.ToArray().Length == 0)
                        {
                            haveAllTags = false;
                            break;
                        }
                    }

                    if (haveAllTags)
                    {
                        ServiceBusMessageInfo msg = new ServiceBusMessageInfo
                        {
                            // TODO: Добавить заполнение других свойств.
                            MessageTypeID = _namingManager.GetMessageType(message.RoutingKey),
                        };

                        rmqMessagesInfo.Add(msg);
                    }
                }

                if (maxCount > 0 && rmqMessagesInfo.Count >= maxCount)
                {
                    rmqMessagesInfo = rmqMessagesInfo.Take(maxCount).ToList();
                    break;
                }
            }

            return(rmqMessagesInfo);
        }
Esempio n. 6
0
        public ActionResult Send(ServiceBusMessageInfo messageInfo)
        {
            if (string.IsNullOrEmpty(messageInfo.MessageToSend))
            {
                // TODO: show error message
                return(RedirectToAction("Index"));
            }

            // create a messaging factory configured to use a ManagedServiceIdentityTokenProvider
            MessagingFactory messagingFactory = CreateMessagingFactoryWithMsiTokenProvider();

            // create a queue client using the queue name supplied by the web.config
            QueueClient queueClient = messagingFactory.CreateQueueClient(ServiceBusQueue);

            // send a message using the input text
            queueClient.Send(new BrokeredMessage(Encoding.UTF8.GetBytes(messageInfo.MessageToSend)));

            queueClient.Close();
            messagingFactory.Close();

            return(RedirectToAction("Index"));
        }