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); }
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")); }