我运行生产者,它生成N条消息,我在 Jmeter 板上看到它们。当我运行接收者时,它从队列中接收所有消息,队列是空的。
static void Receive(string QueName)
{
ConnectionFactory connectionFactory = new ConnectionFactory
{
HostName = HostName,
UserName = UserName,
Password = Password,
};
var connection = connectionFactory.CreateConnection();
var channel = connection.CreateModel();
channel.BasicQos(0, 1, false);
MessageReceiver messageReceiver = new MessageReceiver(channel);
channel.BasicConsume(QueName, false, messageReceiver);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
// Receiver
public class MessageReceiver : DefaultBasicConsumer
{
private readonly IModel _channel;
public MessageReceiver(IModel channel)
{
_channel = channel;
}
public override void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, IBasicProperties properties, ReadOnlyMemory<byte> body)
{
Console.WriteLine($"------------------------------");
Console.WriteLine($"Consuming Message");
Console.WriteLine(string.Concat("Message received from the exchange ", exchange));
Console.WriteLine(string.Concat("Consumer tag: ", consumerTag));
Console.WriteLine(string.Concat("Delivery tag: ", deliveryTag));
Console.WriteLine(string.Concat("Routing tag: ", routingKey));
//Console.WriteLine(string.Concat("Message: ", Encoding.UTF8.GetString(body)));
var message = Encoding.UTF8.GetString(body.ToArray());
Console.WriteLine(string.Concat("Message: ", message));
Console.WriteLine($"------------------------------");
_channel.BasicAck(deliveryTag, false);
}
}
我需要有多个生成器,它们向同一队列生成消息。多个客户从队列接收消息。消息将按队列TTL删除。但现在第一个接收器从队列中获取所有消息。我如何才能做到这一点?
2条答案
按热度按时间daupos2t1#
最好的解决办法是:每个客户端都应该有自己队列,可以是TTL,也可以是过期参数。
qlckcl4x2#
我们在这里使用"exchange",只是为了在同一个示例中显示交换机制,它并不是任务真正需要的(检查Worker2项目,它与另一个绑定到同一个交换的队列一起工作):
消费全样本
link中完整示例