RabbitMQ-- выборочное получение сообщений из очереди

Я новичок в RabbitMQ и задавался вопросом о хорошем подходе к этой проблеме, которую я обдумываю. Я хочу создать службу, которая подписывается на очередь, и только тянет сообщения, соответствующие определенным критериям; например, если в сообщении содержится конкретный заголовок субъекта.

Я все еще узнаю о RabbitMQ и искал советы о том, как подойти к этому. Мои вопросы включают: как потребитель может вытащить из очереди только определенные сообщения? Как производитель может задать заголовок темы в сообщении (если это даже правильный термин?)

Ответ 1

RabbitMQ идеально подходит для этой ситуации. У вас есть несколько вариантов, чтобы делать то, что вы хотите. Я предлагаю прочитать документацию, чтобы лучше понять. Я предлагаю вам использовать тему или прямой обмен. Тема более гибкая. Это происходит следующим образом.

Код производителя подключается к Broker RabbitMQ и создает и Exchange с определенным именем.

Продюсер публикует для обмена. Каждое опубликованное сообщение будет опубликовано с помощью ключа маршрутизации.

Потребитель подключается к брокеру RabbitMQ.

Потребитель создает очередь

Потребитель привязывает очередь к обмену, тот же обмен, определенный в производителе. Связывание также включает в себя ключи маршрутизации для каждого сообщения, требуемого для этого конкретного потребителя.

Допустим, вы публиковали сообщения журнала. Ключ маршрутизации может быть чем-то вроде "log.info", "log.warn", "log.error". Каждое сообщение, опубликованное производителем, будет иметь соответствующий ключ маршрутизации. Затем у вас будет потребитель, который отправляет и отправляет по электронной почте все сообщения об ошибках, а другой - записывает все сообщения об ошибках в файл. Таким образом, почтовый клиент определит привязку своей очереди к обмену с помощью ключа маршрутизации "log.error". Таким образом, хотя обмен получает все сообщения, очередь, определенная для почтового отправителя, будет содержать только сообщения об ошибках. Filelogger определит новую отдельную очередь, связанную с тем же обменом, и настроит другой ключ маршрутизации. Вы можете сделать три отдельных привязки для трех разных ключей маршрутизации или просто использовать шаблон "log. *" Для запроса всех сообщений из обмена, начиная с журнала.

Это простой пример, который показывает, как вы можете добиться того, что хотите.

посмотрите здесь для примеров кода, в частности, номер учебника № 5.

Ответ 2

  1. To Retrive Message from RabbitMQ we need to first connect with RabbitMQ server 

    public WebClient GetRabbitMqConnection(string userName, string password)
    {
        var client = new WebClient(); 
        client.Credentials = new NetworkCredential(userName, password);
        return client;
    }

 2. Now retrieve message from RabbitMQ using below code.

      public string GetRabbitMQMessages(string domainName, string port, string 
                    queueName, string virtualHost, WebClient client, string 
                    methodType)
      {
                  string messageResult = string.Empty;
                  string strUri = "http://" + domainName + ":" + port + 
                                  "/api/queues/" + virtualHost + "/";
                  var data = client.DownloadString(strUri + queueName + "/");
                  var queueInfo = JsonConvert.DeserializeObject<QueueInfo>(data);
                  if (queueInfo == null || queueInfo.messages == 0)
                             return string.Empty;
                  if (methodType == "POST")
                  {
                      string postbody = "  
                      {\"ackmode\":\"ack_requeue_true\",\"count\":
                       \"$totalMessageCount\",\"name\":\"${DomainName}\",
                       \"requeue\":\"false\",\"encoding\":\"auto\",\"vhost\" :
                       \"${QueueName}\"}";
                       postbody = postbody.Replace("$totalMessageCount", 
                       queueInfo.messages.ToString()).Replace("${DomainName}", 
                       domainName).Replace("${QueueName}", queueName);
                       messageResult = client.UploadString(strUri + queueName + 
                       "/get", "POST", postbody);
                }
                return messageResult;
    } 


   I think this will help you to implement RabbitMQ.