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.