【RabbitMQ.Clinet笔记】连接
核心接口和类
IConnection
:表示一个连接IModel
:表示一个ChannelConnectionFactory
:连接工厂IBasicConsumer
:代表一个消费者消息DefaultBasicConsumer
:常用的消费者基类
主要命名空间
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;
当AutoClose
为true
时,最后关闭的通道也将导致连接关闭。
网络故障恢复
客户端和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;