RabbitMQ 多线程 生产者 QueueDeclare

wroger 2020-08-25 10:04:31
        static IModel model;
public IModel RetrieveSomeSharedIModelInstance()
{
if (model == null)
{
var factory = new ConnectionFactory()
{
HostName = "10.10.0.210",
UserName = "1",
Password = "1",
//Port = options.Value.RabbitPort,
};
IConnection _connection = factory.CreateConnection();
model = _connection.CreateModel();
model.QueueDeclare(queue: "Test",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
}
return model;
}
public void SendMessage(string message)
{
try
{
IModel _channel = RetrieveSomeSharedIModelInstance();
var properties = _channel.CreateBasicProperties();
properties.DeliveryMode = 2;//数据模式:1不持久化,2持久化
string msgJson = DataManage.ObjToJson.ObjectToJsonOfNewton(message);
var body = System.Text.Encoding.UTF8.GetBytes(msgJson);
lock (_channel)
{
_channel.BasicPublish(exchange: "",
routingKey: "Test",
basicProperties: properties,
body: body);
}
}
catch (Exception e)
{
throw (e);
}
}


按照官方文档说法,应该避免多个线程同时使用IModel实例,在使用时加锁,那么这个锁只能加到BasicPublish上。上面的代码如果将QueueDeclare也放到锁内的话,即多线程同时声明队列,就会报异常: "Pipelining of requests forbidden" 。

声明队列只能单线程操作吗?加锁也不好使?

如果不放到 发送消息之前的话,怎么确保队列是存在的?
...全文
240 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

778

社区成员

发帖
与我相关
我的任务
社区描述
云计算 网络相关讨论
社区管理员
  • 网络
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧