【问题标题】:Is ServiceStack.RabbitMQServer thread safe ? Can it start in task?ServiceStack.RabbitMQServer 线程安全吗?可以在任务中启动吗?
【发布时间】:2018-02-09 18:53:54
【问题描述】:

应用程序:ServiceStack 上的 .NET WebServer 使用 RabbitMQ 通过 RabbitMQServer 类托管服务。

基础设施:WebServer 和 RabbitMQ 位于不同的 Docker 容器中。

问题:在启动 WebServer App 期间,它必须连接到 RabbitMQServer.Start(),但连接失败,因为与 Rabbit 的容器尚未启动。

我想尝试检查与 Rabbit 的连接能力并在 .NET 任务中启动 RabbitMQServer。 RabbitMQServer 类线程安全吗?

我的代码:

    ...
    RabbitMQServer _rabbitMqServer = ...;
    ...  
    public void Start()
    {
        Task.Run(() => TryToStart());
    }

    private void TryToStart()
    {
        var tryIndex = 0;
        const int tryCount = 10;
        const int tryTimeoutStep = 3000;
        const int tryMaxTimeout = 30000;
        while (tryIndex < tryCount)
        {
            tryIndex++;
            try
            {
                _logger.Info("Próba połączenia z RabbitMQ ...");
                ((RabbitMqMessageFactory) _rabbitMqServer.MessageFactory).ConnectionFactory.CreateConnection();

                // nie ma BrokerUnreachableException
                _rabbitMqServer.Start();
                return;
            }
            catch (BrokerUnreachableException e)
            {
                var millisecondsTimeout = Math.Min(tryTimeoutStep * tryIndex, tryMaxTimeout);
                _logger.Error($"{e.Message} - czekam {millisecondsTimeout / 1000}s ...");
                Thread.Sleep(millisecondsTimeout);
            }
        }

        _logger.Error("Nie połączono z RabbitMQ!");
    }

【问题讨论】:

  • 您介意重新表述您的问题吗?我不知道你想问什么。 RabbitMQ 服务器不是对象,根据该定义不能是“线程安全的”。
  • 重新措辞 - 完成

标签: rabbitmq servicestack


【解决方案1】:

在您使用完连接后,请务必处理掉您创建的连接。

否则可以从多个线程调用RabbitMQ.ClientConnectionFactory.CreateConnection(),但返回的连接只能由创建它的线程使用,使用后应该将其丢弃。

【讨论】:

  • 谢谢。我在我的问题中添加了描述。我们使用 DI - Autofac - 它应该调用 Dispose。
  • @Bernard 不,不是,您的代码正在打开一个未处理的僵尸连接。没有 IOC 可以管理它没有创建或注册的实例的生命周期。将打开的连接包装在 using(){} 中,或者将其分配给一个变量,您可以在不再需要它后调用它的 .Dispose()
  • 好的。我将 CreateConnection 放在“使用”中,如果它没有抛出 BrokerUnreachableException,我将在同一个线程中执行 _rabbitMqServer.Start()。在 Services 线程中使用这个 RabbitMqServer 并在 MainThread 中使用 Dispose 是否安全?
  • @Bernard 是的,这将处理它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多