我在我的网络应用程序中使用rabbit-Mq(Asp.net-MVC 4.0)。我的要求是向特定用户发送消息。假设user1在线并且他通过rabbit-Mq向user2发送消息。它应仅由“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);
}
}
}
答案 0 :(得分:1)
首先,您必须记住以下事项:
在您的情况下,您可以考虑使用主题或标题交换,但在这种情况下,您应该为每个用户 有一个队列,如果系统中的用户数量很大,那么它将是非常耗费资源的。
您还可以为您添加特定标题:
var props = model.CreateBasicProperties();
props.Headers.Add("UserId", userId);
然后在RecieveMessage()
方法中从队列中读取消息后看到此标题,如果是针对当前用户的消息 - 接收它并确认此消息,否则
不承认此消息。
但这是不好的解决方案。我只是将队列中的消息保存到数据库中,然后将其读出来由用户进行过滤。