2021-04-02

本文介绍了RabbitMQ的发布/订阅模式,其中生产者通过exchange发布消息,exchange根据类型(如direct、topic、headers、fanout)将消息推送到队列,消费者订阅并消费这些消息。示例代码展示了如何创建生产者和消费者,并使用Fanout类型的exchange进行消息传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* RabbitMq 发布者/订阅者模式

一.
1 producer 负责发布消息
2 queue 负责存储转发消息
3 consumer 负责订阅和消费消息

二.
1.生产者 不直接发送的消息给一个queue,甚至更多的时候 生产者 甚至不知道消息将被传递给队列

生产者直接将消息发送给exchange.
2.exchange交换机,一端接收消息 一端将消息push给队列

交换机的工作模式
1 direct
2 topic
3 headers
4 fanout

*/

// 生产者的 代码

using System;
using RabbitMQ.Client;
using System.Text;

class EmitLog
{
public static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = “localhost” };
using(var connection = factory.CreateConnection())
using(var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: “logs”, type: ExchangeType.Fanout);//声明一个交换机

        var message = GetMessage(args);
        var body = Encoding.UTF8.GetBytes(message);
        channel.BasicPublish(exchange: "logs",
                             routingKey: "",
                             basicProperties: null,
                             body: body);
        Console.WriteLine(" [x] Sent {0}", message);
    }

    Console.WriteLine(" Press [enter] to exit.");
    Console.ReadLine();
}

private static string GetMessage(string[] args)
{
    return ((args.Length > 0)
           ? string.Join(" ", args)
           : "info: Hello World!");
}

}

//订阅者的代码

using System;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;

class ReceiveLogs
{
public static void Main()
{
var factory = new ConnectionFactory() { HostName = “localhost” };
using(var connection = factory.CreateConnection())
using(var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: “logs”, type: ExchangeType.Fanout);

        var queueName = channel.QueueDeclare().QueueName;
        channel.QueueBind(queue: queueName,
                          exchange: "logs",
                          routingKey: "");

        Console.WriteLine(" [*] Waiting for logs.");

        var consumer = new EventingBasicConsumer(channel);
        consumer.Received += (model, ea) =>
        {
            var body = ea.Body.ToArray();
            var message = Encoding.UTF8.GetString(body);
            Console.WriteLine(" [x] {0}", message);
        };
        channel.BasicConsume(queue: queueName,
                             autoAck: true,
                             consumer: consumer);

        Console.WriteLine(" Press [enter] to exit.");
        Console.ReadLine();
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值