【发布时间】:2013-09-23 11:12:59
【问题描述】:
我正在研究 rabbitmq,我对某些点感到困惑,例如。 我刚刚实现了一个来自互联网的示例,它创建了一个队列然后它获取 来自该队列的消息,从而将其显示在网页上。 现在我的问题是:: 假设我的服务器安装了 RabbitmQ,并且多个用户正在访问我所在的网站 已经实现了rabbitmq。现在,第一个用户发送了一条消息,但是它将向谁发送这条消息? 致所有将打开页面的用户,因为代码对于发送的消息和名称是通用的 队列的数量也将相同。
假设,第一个用户在队列“Queue1”上发送一条消息“Hello” 现在,另一个用户在同一个队列上发送另一个消息 =“Hello World” 还有一个用户在同一个队列上发送了一条消息=“Hello Worl World”。 现在第 n 个用户单击接收消息,那么将向他显示哪条消息? 第一个,第二个还是第三个?
这意味着我们的应用程序将始终只有一个队列?
有人可以指导我吗?我很困惑......
我将在下面粘贴我将用于我的网站的代码示例
//For sending the messge
protected void btnSendMail_Click(object sender, EventArgs e)
{
try
{
var factory = new ConnectionFactory();
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
// ConnectionFactory factory = new ConnectionFactory() { HostName = "localhost" };
// // factory.UserName = txtUserEmail.Text.ToString();
//// factory.Password = "password";
// factory.VirtualHost = "/";
// factory.Protocol = Protocols.FromEnvironment();
// factory.HostName = "localhost";
// factory.Port = AmqpTcpEndpoint.UseDefaultPort;
// IConnection conn = factory.CreateConnection();
// using (var channel = conn.CreateModel())
// {
// channel.QueueDeclare("hello", false, false, false, null);
// string message = "Hello World!";
// var body = Encoding.UTF8.GetBytes(txtUserEmail.Text.ToString());
// channel.BasicPublish("", "hello", null, body);
// conn.Close();
// }
//Sending Message
channel.QueueDeclare("hello1", false, false, false, null);
string message = txtUserEmail.Text.ToString();
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish("", "hello1", null, body);
//Console.WriteLine(" [x] Sent {0}", message);
//Console.ReadLine();
Label1.Text = Encoding.Default.GetString(body);
}
}
}
catch
{
}
}
//For receiving the message.
protected void btnReceive_Click(object sender, EventArgs e)
{
try
{
//var factory = new ConnectionFactory() { HostName = "localhost" };
//using (var connection = factory.CreateConnection())
//{
// using (var channel = connection.CreateModel())
// {
// channel.QueueDeclare("hello", false, false, false, null);
// BasicGetResult result = channel.BasicGet("hello", false);
// var consumer = new QueueingBasicConsumer(channel);
// channel.BasicConsume("hello", true, consumer);
// Console.WriteLine(" [*] Waiting for messages." +
// "To exit press CTRL+C");
// while (true)
// {
// var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
// var body = ea.Body;
// var message = Encoding.UTF8.GetString(body);
// Console.WriteLine(" [x] Received {0}", message);
// Label1.Text = message.ToString();
// }
// }
//}
var factory = new ConnectionFactory();
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
bool noAck = false;
BasicGetResult result = channel.BasicGet("hello1", noAck);
if (result == null)
{
}
else
{
IBasicProperties props = result.BasicProperties;
byte[] Body = result.Body;
Label1.Text = Encoding.Default.GetString(Body);
}
}
}
}
catch
{
}
}
【问题讨论】:
-
我对这个问题不是很清楚。您正在解决哪个示例 RabbitMQ 问题? RabbitMQ 提供消息传递,您提供应用程序。
-
先生,我的问题很简单。我有一个网站,我正在其中实施rabbitMq。如您所知,该站点用于发送和接收消息。为此,它创建一个队列并在其中存储一条消息,并在接收消息时使用相同的队列。现在,假设该网站的第一个用户发送一条消息,一个队列保存该消息,现在另一个用户发送一条消息,现在会发生什么.我应该创建一个不同的队列还是相同的队列可以存储它。我使用了相同的队列,但在接收时我只收到第一条消息,而不是第二个用户发送的消息。
-
这真的取决于你如何设置 RabbitMQ。是的,您可以使用单个队列并处理多条消息。但是你遗漏了很多信息。您使用的是直接、扇出还是主题交换?你的队列是如何配置的?如果您显示您的实际代码(在问题中)也许我们可以提供帮助:)
-
通过将 noAck 设置为 false,您还没有确认收到消息。尝试将 noAck 设置为 true。
-
@Sandy 以便我们为您的问题提供更好的答案,我们需要从架构的角度了解您的系统正在尝试完成什么。然后我们可以建议如何最好地布置它。说“它需要为多个用户工作”是没有帮助的。我建议您重新编写您的问题并告诉我们您正在构建的系统。
标签: c# asp.net .net asp.net-mvc rabbitmq