gpt4 book ai didi

c# - 通过 ThreadLocal 访问 RabbitMQ IModel 是否有任何影响或陷阱?

转载 作者:行者123 更新时间:2023-11-30 23:08:04 25 4
gpt4 key购买 nike

我创建了一个类来促进通过队列进行简单的文本消息传输

public class TextQueueTransmitter
{
private Func<IModel> channelProvider;
private IBasicProperties props;
private string queue;

public TextQueueTransmitter(Func<IModel> channelProvider, string queue)
{
this.queue = queue;
this.channelProvider = channelProvider;

//will be called once in a thread
this.channelProvider().QueueDeclare(queue: queue,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
props = this.channelProvider().CreateBasicProperties();
}

public void SendMessage(string message)
{
var body = Encoding.UTF8.GetBytes(message);
props.DeliveryMode = 1;

//will be called multiple times not necessarily in the same thread
channelProvider().BasicPublish(exchange: "",
routingKey: queue,
basicProperties: null,
body: body);
}
}

初始化会像

IConnection connection = ...
ThreadLocal channelThreadLocal = new ThreadLocal<IModel>(connection.CreateModel);
TextQueueTransmitter transmitter = new TextQueueTransmitter(() => channelThreadLocal.Value, "queue name");

之前我直接将 IModel 传递给发送器,但在阅读了 here 之后IModel 不是线程安全的,我意识到如果我想让 TextQueueTransmitter 线程安全,我必须重新考虑它。

我的问题是,仅将 IModel 包装在 ThreadLocal 中是否有任何影响?例如,如果在构造对象的线程之外的线程中调用 SendMessage(),则 QueueDeclareBasicPublish 将在不同的线程中调用。这会导致任何问题吗?

更新:资源处置

正如Samuel在他的回答中所指出的,有一个我想到但忘记写的 channel 处置问题。我打算做的是在程序终止时调用 ThreadLocalDispose()希望 这将调用底层的 Dispose() IModel。尽管自ThreadLocal documentation起我将不得不进行验证没有指定它是否处理底层对象(它们应该实现 IDisposable)。

这会带来“悬挂”连接的危险,即特定线程的连接不再运行。尽管我不认为这是一个严重的问题,因为所有 TextQueueTransmitter 实例都是长期存在的对象,而且我不会过度创建线程。

最佳答案

我预见到的最大问题不是处理模型和泄漏资源。您需要控制它们的创建时间并适本地处理它们。

关于c# - 通过 ThreadLocal 访问 RabbitMQ IModel 是否有任何影响或陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46772850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com