Отправка сообщений от rabbitMq
Я использую rabbit-Mq в своем веб-приложении (Asp.net-MVC 4.0). Мое требование - отправить сообщение конкретному пользователю. Предположим, если пользователь 1 онлайн и он отправляет сообщение пользователю 2 по адресу rabbit-Mq. Он должен быть получен только "user2". Код, который я использовал, является шаблоном, который хранит сообщение в очереди, и всякий раз, когда пользователь нажимает на кнопку "Получить", он получает это сообщение, но в моем случае нет ограничений для конкретного пользователя. Любой может получить это сообщение, которое неверно, и я должен с этим справиться. Пожалуйста, помогите мне в этом.
Есть ли в Rabbit-Mq что-нибудь, что может отличить правильное сообщение от правильного пользователя / потребителя? Можем ли мы установить ключ с сообщением и проверить ключ при получении? Это возможно?
Ниже я пишу код, который я использую для отправки и получения сообщений
public ActionResult SendMessage(MessagingModel ObjModel)
{ var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
Message = ObjModel.Message;
channel.QueueDeclare("MessageQueue", true, false, false, null);
var body = Encoding.UTF8.GetBytes(ObjModel.Message);
channel.BasicPublish("", "MessageQueue", null, body);
}
}
}
public JsonResult RecieveMessage()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.QueueDeclare("MessageQueue", true, false, false, null);
bool noAck = true;
BasicGetResult result = channel.BasicGet("MessageQueue", noAck);
if (result == null)
{
Message = "No Messages Found.";
}
else
{
IBasicProperties props = result.BasicProperties;
byte[] Body = result.Body;
Message = Encoding.Default.GetString(Body);
}
}
}
1 ответ
Во-первых, вы должны запомнить следующие вещи:
- Все сообщения в RabbitMQ публикуются через биржи.
- Очереди привязаны к биржам.
- Событие, если вы публикуете сообщение непосредственно в очередь, фактически оно все равно проходит через обмен по умолчанию - (по умолчанию AMPQ).
- Есть разные виды обменов. Вы можете прочитать немного об обменах здесь: https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html
В вашем случае вы можете рассмотреть возможность использования обмена темами или заголовками, но в этом случае вы должны иметь для каждого пользователя очередь, и если число пользователей в системе велико, то это будет очень ресурсоемким.
Также вы можете добавить определенный заголовок к вашему сообщению:
var props = model.CreateBasicProperties();
props.Headers.Add("UserId", userId);
а затем в RecieveMessage()
после чтения сообщения из очереди см. этот заголовок, а если сообщение предназначено для текущего пользователя - получите его и подтвердите это сообщение, в противном случае не подтвердите это сообщение.
Но это плохое решение. Я просто сохранял сообщения из очереди в базе данных, а затем считывал их, фильтруя по пользователю.