添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

主要命名空间

RabbitMQ.Client :核心API
RabbitMQ.Client.Events :客户端库的各种事件和事件处理程序,包括 EventingBasicConsumer , 建立在消费者实现c#事件处理程序。
RabbitMQ.Client.Exceptions :用户可见的异常

连接到RabbitMQ,要通过一个连接工厂和其配置为使用所需的主机,虚拟主机和证书。然后使用 ConnectionFactory.CreateConnection() 打开的连接。

ConnectionFactory connectionFactory = new ConnectionFactory
    HostName = "xxx.xxx.xxx.xxx",
    //Port = 5672,
    VirtualHost="/",
    UserName = "admin",
    Password = "admin"
IConnection connection = connectionFactory.CreateConnection();

也可以使用下面这种方式:

ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.Uri = "amqp://user:pass@hostName:port/vhost";
IConnection connection = connectionFactory.CreateConnection();
IModel channel = connection.CreateModel();

IModel实例不应由多个线程同时使用,当多个线程同时使用IModel会抛出异常,如果多个线程需要访问特定的IModel实例,应用程序应该实施互斥本身。

IModel channel = connection.CreateModel();
lock (channel) {
  ch.BasicPublish(...);

断开RabbitMQ的连接

channel.Close(200, "Goodbye");
connection.Close();

注意,关闭频道被认为是良好的做法,但不是绝对必要的 - 它将在底层连接关闭时自动完成。

IConnection.AutoClose

默认值false,当连接上的最后一个打开通道关闭后连接是否自动关闭。

IConnection conn = factory.CreateConnection(...);
IModel channel = conn.CreateModel();
conn.AutoClose = true;

AutoClosetrue时,最后关闭的通道也将导致连接关闭。

网络故障恢复

客户端和RabbitMQ节点之间的网络连接可能失败,客户端支持自动恢复连接和拓扑

自动恢复连接执行以下操作

1、重新连接 (Reconnect)
2、还原连接侦听器( Restore connection listeners)
3、重新打开通道(Re-open channels)
4、还原频道侦听器(Restore channel listeners)
5、恢复通道basic.qos设置,发布者确认和事务设置( Restore channel basic.qos setting, publisher confirms and transaction settings)

要启用自动连接恢复,请将ConnectionFactory.AutomaticRecoveryEnabled设置为true

ConnectionFactory factory = new ConnectionFactory();
factory.AutomaticRecoveryEnabled = true;
factory.NetworkRecoveryInterval = TimeSpan.FromSeconds(10);//重试间隔
IConnection conn = factory.CreateConnection();

factory.NetworkRecoveryInterval:如果恢复由于异常失败,将在固定的时间间隔(默认为5秒)后重试。

拓扑恢复对channel执行以下操作

1、重新声明交换器
2、重新声明队列
3、恢复所有绑定
4、恢复所有消费者

拓扑恢复涉及恢复queues, exchanges, bindings, and consumers。 默认情况下启用它

ConnectionFactory factory = new ConnectionFactory();
Connection conn = factory.CreateConnection();
factory.AutomaticRecoveryEnabled = true;
factory.TopologyRecoveryEnabled  = true;